螺旋矩陣:
export default(arr)=>{ //處理每一圈的數據遍歷過程 let map=(arr,r=[])=>{ for(let i=0,len=arr.length;i<len;i++){ if(i===0){ r=r.concat(arr[i]) }else if(i===len-1){ r=r.concat(arr[i],reverse()) }else{ r.push(arr[i].pop()) } } arr.shift() arr.pop() for(let i=arr.length-1;i>=0;i--){ r.push(arr[i].shift()) } if(arr.length){ return map(arr,r) }else{ return r } } return map(arr,[]) }
旋轉圖像:
export default(arr)=>{ // 獲取n的維度 let vecor=arr.length //垂直反轉 for(let i=0,len=vecor/2;i<len;i++){ for(let j=0,tmp;j<vecor;j++){ tmp=arr[i][j] arr[i][j]=arr[vecor-i-1][j] arr[vecor-i-1][j]=tmp } } //對角線翻轉 for(let i=0;i<vecor;i++){ for(let j=0,tmp;j<i;j++){ tmp=arr[i][j] arr[i][j]=arr[j][i] arr[j][i]=tmp } } return arr }
二叉樹:
對稱的二叉樹:
//二叉樹的節點 class Node{ constructor(val){ this.val=val this.left=this.right=undefined } } class Tree{ constructor(data){ //臨時存儲所有節點,方便尋找父子節點 let nodeList=[] //頂節點 let root for(let i=0,len=data.length;i<len;i++){ let node=new Node(data[i]) nodeList.push(node) if(i>0){ //第一層 //計算當前節點屬於哪一層 let n=Math.floor( Math.sqrt(i+1)) //記錄當前層的起始點 let q=Math.pow(2,n)-1 //記錄上一層的起始點 let p=Math.pow(2,n-1)-1 //找到當前節點的父節點 let parent=nodeList[p+Math.floor((i-q)/2)] //將當前節點和上一層的父節點做關聯 if(parent.left){ parent.right=node }else{ parent.left=node } } } root=nodeList.shift() nodeList.length=0 return root } //判斷是不是對稱 static isSymmetry(root){ if(!root){ return true } let walk=(left,right)=>{ if(!left&&!right){ return true } if((left&&!right)||(!left&&right)||(left.val!==right.val)){ return false } return walk(left.left,right.right)&&walk(left.right,right.left) } return walk(root.left,root.right) } } export default Tree export{ Node }
class Node{ constructor(val){ this.val=val this.left=this.right=undefined } } class Tree{ constructor(data){ let root=new Node(data.shift()) //遍歷所有的數據,逐漸插入到當前這顆搜索樹中 data.array.forEach(item => { this.insert(root,item) }); return root } insert(node,data){ if(node.val>data){ if(node.left===undefined){//判斷是不是左節點 node.left=new Node(data) }else{ this.insert(node.left,data) } }else{ if(node.right===undefined){ node.right=new Node(data) }else{ this.insert(node.right,data) } } } static walk(root){ if(!root.left&&!root.right){ return true }else if((root.left&&root.val<root.left.val)|| root.right&&root.val>root.right.val){ return false }else{ return Tree.walk(root.left)&&Tree.walk(root.right) } } } export default Tree export{ Node }