劍指offer-JavaScript版(12-22題)
- 2019 年 10 月 29 日
- 筆記
牛客網:faremax https://www.nowcoder.com/discuss/49349
12.給定一個double類型的浮點數base和int類型的整數exponent。求base的exponent次方。
function Power(base, exponent){ return Math.pow(base, exponent); }
13.輸入一個整數數組,實現一個函數來調整該數組中數字的順序,使得所有的奇數位於數組的前半部分,所有的偶數位於位於數組的後半部分,並保證奇數和奇數,偶數和偶數之間的相對位置不變。
function reOrderArray(array){ var result = []; var even = []; array.forEach(function(item){ if((item & 1) === 1){ result.push(item); } else { even.push(item); } }); return result.concat(even); }
14.輸入一個鏈表,輸出該鏈表中倒數第k個結點。
/*function ListNode(x){ this.val = x; this.next = null; }*/ function FindKthToTail(head, k){ if(!head || k <= 0){ return null; } var i = head, j = head; while(--k){ j = j.next; if(!j){ return null; } } while(j.next){ i = i.next; j = j.next; } j = null; return i; }
15.輸入一個鏈表,反轉鏈表後,輸出鏈表的所有元素。
/*function ListNode(x){ this.val = x; this.next = null; }*/ function ReverseList(pHead){ var newHead, temp; if(!pHead){ return null; } if(pHead.next === null){ return pHead; } else { newHead = ReverseList(pHead.next); } temp = pHead.next; temp.next = pHead; pHead.next = null; temp = null; return newHead; }
16.輸入兩個單調遞增的鏈表,輸出兩個鏈表合成後的鏈表,當然我們需要合成後的鏈表滿足單調不減規則。
/*function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2){ if(!pHead1){ return pHead2 ? pHead2 : null } else if(!pHead2){ return pHead1; } // debugger; var curr1 = pHead1; var curr2 = pHead2; var result = new ListNode(-1); var curr = result; while(curr1 && curr2){ if(curr1.val < curr2.val){ curr.next = curr1; curr1 = curr1.next; } else{ curr.next = curr2; curr2 = curr2.next; } curr = curr.next; } if(curr1){ curr.next = curr1; } if(curr2){ curr.next = curr2; } //防止記憶體泄露 curr = result.next; result.next = null; result = curr; curr = curr1 = curr2 = null; return result; }
17.輸入兩棵二叉樹A,B,判斷B是不是A的子結構。(ps:我們約定空樹不是任意一個樹的子結構)
function HasSubtree(pRoot1, pRoot2){ if(pRoot1 == null || pRoot2 == null){ return false; } if(isSubTree(pRoot1, pRoot2)){ return true; } else{ return HasSubtree(pRoot1.left, pRoot2) || HasSubtree(pRoot1.right, pRoot2); } function isSubTree(pRoot1, pRoot2){ if(pRoot2 == null) return true; if(pRoot1 == null) return false; if(pRoot1.val === pRoot2.val){ return isSubTree(pRoot1.left, pRoot2.left) && isSubTree(pRoot1.right, pRoot2.right); } else { return false; } } }
18.操作給定的二叉樹,將其變換為源二叉樹的鏡像。
function Mirror(root){ if(!root){ return null; } var temp = root.left; root.left = root.right; root.right = temp; if(root.left){ Mirror(root.left); } if(root.right){ Mirror(root.right); } }
19.輸入一個矩陣,按照從外向里以順時針的順序依次列印出每一個數字,例如,如果輸入如下矩陣:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 則依次列印出數字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.
function printMatrix(matrix){ if(!matrix || !matrix.length) return null; var result = []; var rows = matrix.length, cols = matrix[0].length; var len = rows * cols; var i = 0, j = 0; var circle = 0; while(1){ while(j < cols - circle){ result.push(matrix[i][j]); j++; } if(result.length === len) break; j--, i++; while(i < rows - circle){ result.push(matrix[i][j]) i++; } if(result.length === len) break; i--, j--; while(j >= circle){ result.push(matrix[i][j]); j--; } if(result.length === len) break; j++, i--; circle++; while(i >= circle){ result.push(matrix[i][j]) i--; } if(result.length === len) break; j++, i++; } return result; }
20.定義棧的數據結構,請在該類型中實現一個能夠得到棧最小元素的min函數。
var stack = []; function push(node){ stack.push(node); } function pop(){ return stack.pop(); } function top(){ return stack[stack.length - 1]; } function min(){ return Math.min.apply(null, stack); }
21.輸入兩個整數序列,第一個序列表示棧的壓入順序,請判斷第二個序列是否為該棧的彈出順序。假設壓入棧的所有數字均不相等。例如序列1,2,3,4,5是某棧的壓入順序,序列4,5,3,2,1是該壓棧序列對應的一個彈出序列,但4,3,5,1,2就不可能是該壓棧序列的彈出序列。(注意:這兩個序列的長度是相等的)
function IsPopOrder(pushV, popV){ if(!pushV.length || !popV.length){ return false; } var temp = []; var popIndex = 0; var len = pushV.length; for(var i = 0; i < len; i++){ temp.push(pushV[i]); while(temp.length && temp[temp.length - 1] === popV[popIndex]){ temp.pop(); popIndex++; } } return temp.length === 0; }
22.從上往下列印出二叉樹的每個節點,同層節點從左至右列印。
/* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ function PrintFromTopToBottom(root){ if (!root) { return []; } var queue = []; queue.push(root); var result = []; while (queue.length) { var temp = queue.shift(); result.push(temp.val); if (temp.left) { queue.push(temp.left); } if (temp.right) { queue.push(temp.right); } } return result; }