劍指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;  }