
剑指Offer
小小布丁--pudding
一只爬行的小乌龟~~
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【剑指Offer】52、正则表达式匹配
这题也用到二维dp,数组每一项都初始化为false,但要注意不能写成new Array(m+1).fill(new Array(n+1).fill(false)),因为这样m+1个一维数组就存在相互引用的问题,就会bug~~~ 这题要注意分成多种情况考虑: ①恰好此时能匹配上,即s[i-1]===pattern[j-1]或pattern[j-1]='.',那么dp[i][j]=dp[i-1][...原创 2020-02-07 09:17:26 · 111 阅读 · 0 评论 -
【剑指Offer】67、 剪绳子
尽量把绳子分成3+3+3+3.。。。。 function cutRope(number) { if(number==2) return 1; if(number==3) return 2; var x=Math.floor(number/3); var y=number%3; if(y==0) return Math.pow(3,x); if(y==...原创 2019-10-20 21:59:53 · 122 阅读 · 0 评论 -
【剑指Offer】66、机器人的运动范围
递归+回溯 function movingCount(threshold, rows, cols) { var visited=[]; for(var i=0;i<rows;i++){ visited.push([]); for(var j=0;j<cols;j++) visited[i][j]=false; ...原创 2019-10-20 21:19:33 · 103 阅读 · 0 评论 -
【剑指Offer】65、矩阵中的路径
回溯 function hasPath(matrix, rows, cols, path) { var flag=[]; for(var i=0;i<matrix.length;i++) flag.push(false); for(var i=0;i<rows;i++){ for(var j=0;j<cols;j++){ ...原创 2019-10-20 20:46:21 · 85 阅读 · 0 评论 -
【剑指Offer】64、滑动窗口的最大值
function maxInWindows(num, size) { if(size==0||size>num.length) return []; var res=[]; var count=num.length-size; var max=Math.max.apply(this,num.slice(0,size)); res.push(max);...原创 2019-10-19 21:01:25 · 90 阅读 · 0 评论 -
【剑指Offer】63、数据流中的中位数
let arr=[]; function Insert(num) { let len=arr.length; if(len===0) arr.push(num); else{ var i; for(i=len-1;i>=0;i--){ if(arr[i]>num) arr[i+1]=arr[i]; el...原创 2019-10-19 20:16:34 · 96 阅读 · 0 评论 -
【剑指Offer】62、二叉搜索树的第k个结点
function KthNode(pRoot, k) { if(k<=0) return null; var count=0; var res; function inOrder(pRoot,k){ if(pRoot==null||count>=k) return; inOrder(pRoot.left,k); ...原创 2019-10-19 19:29:54 · 75 阅读 · 0 评论 -
【剑指Offer】61、序列化二叉树
这题要好好理解, var arr=[]; function Serialize(pRoot) { if(pRoot==null) arr.push("#"); else{ arr.push(pRoot.val); Serialize(pRoot.left); Serialize(pRoot.right); } } fu...原创 2019-10-18 21:23:57 · 97 阅读 · 0 评论 -
【剑指Offer】60、把二叉树打印成多行
function Print(pRoot) { var queue=[pRoot],res=[]; if(!pRoot) return []; while(queue.length){ var count=queue.length,temp=[]; while(count-->0){ var node=queu...原创 2019-10-18 20:08:08 · 85 阅读 · 0 评论 -
【剑指Offer】59、 按之字形顺序打印二叉树
function Print(pRoot) { var queue=[pRoot],flag=false,res=[]; if(!pRoot) return []; while(queue.length){ var count=queue.length,temp=[]; while(count-->0){ va...原创 2019-10-18 20:06:02 · 87 阅读 · 0 评论 -
【剑指Offer】58、对称的二叉树
function isSymmetrical(pRoot) { if(pRoot==null) return true; return Symmetrical(pRoot.left,pRoot.right); } function Symmetrical(l,r){ if(l==null&&r==null) return true; if(l==...原创 2019-10-17 20:36:01 · 91 阅读 · 0 评论 -
【剑指Offer】57、二叉树的下一个结点
① 如果一个节点的右子树不为空,那么该节点的下一个节点是右子树的最左节点; ② 否则,向上找第一个左链接指向的树包含该节点的祖先节点。 function GetNext(pNode) { if(pNode.right!==null){ var node=pNode.right; while(node.left!==null) node=node.lef...原创 2019-10-17 20:14:35 · 145 阅读 · 0 评论 -
【剑指Offer】56、删除链表中重复的结点
刷题刷到这里,我发现一般凡是有结点的数据结构(链表呀,二叉树呀),都是可以用递归解决的,而且非常好用~~ 方法一、递归 /*function ListNode(x){ this.val = x; this.next = null; }*/ function deleteDuplication(pHead) { if(pHead===null||pHead.next==...原创 2019-10-17 18:57:08 · 99 阅读 · 0 评论 -
【剑指Offer】55、 链表中环的入口结点
JS跟Java还是有差别滴,它把变量类型弱化啦,使用时尽情使用var吧~~~hhh function EntryNodeOfLoop(pHead) { if(pHead==null||pHead.next==null) return null; var fast=pHead,slow=pHead; do{ fast=fast.next.next; ...原创 2019-10-16 22:15:59 · 81 阅读 · 0 评论 -
【剑指Offer】54、字符流中第一个不重复的字符
JS--用对象来做,类似于java 中的HashMap. var map={}; function Init(){ map={}; } function Insert(ch) { if(!map[ch]) map[ch]=1; else map[ch]++; } function FirstAppearingOnce() { for(var ch in ma...原创 2019-10-16 17:42:51 · 115 阅读 · 0 评论 -
【剑指Offer】53、表示数值的字符串
第一次用js刷题,好激动好激动~~ 注意 .3 3. 都对,但e前后都必须得有数字 function isNumeric(s) { const reg=/^([+-])?\d*(\.\d*)?(\de([+-])?\d+)?$/i; return reg.test(s); } ...原创 2019-10-16 16:41:08 · 92 阅读 · 0 评论 -
【剑指Offer】51、构建乘积数组
非常巧妙,分两头行动,先从头到尾,再从未到头~~~ function multiply(array) { const n=array.length; let arr_B=new Array(n).fill(null); let prod_l=1,prod_r=1; for(let i=0;i<n;i++){ arr_B[i]=prod_l;...原创 2019-10-15 19:41:39 · 92 阅读 · 0 评论 -
【剑指Offer】50、数组中重复的数字
时间复杂度O(n) 对于这种数组元素在 [0, n-1] 范围内的问题,可以将值为 i 的元素调整到第 i 个位置上进行求解。 一旦"鸠占鹊巢",发现自己的老窝被亲兄弟占,说明有重复元素。 function duplicate(numbers, duplication) { // write code here //这里要特别注意~找到任意重复的一个值并赋值到duplica...原创 2019-10-15 19:22:02 · 85 阅读 · 0 评论 -
【剑指Offer】49、把字符串转换成整数
function StrToInt(str) { let res=0,flag=1,len=str.length; if(!len) return 0; if(str[0]==='-') flag=-1; for(var i=0;i<len;i++){ var ch=str[i]; if(i===0&&(ch=...原创 2019-10-14 22:17:26 · 83 阅读 · 0 评论 -
【剑指Offer】48、不用加减乘除做加法
a ^ b 表示没有考虑进位的情况下两数的和,(a & b) << 1 就是进位。 递归会终止的原因是 (a & b) << 1 最右边会多一个 0,那么继续递归,进位最右边的 0 会慢慢增多,最后进位会变为 0,递归终止。 function Add(num1, num2) { if(num1===0) return num2; if(n...原创 2019-10-13 20:53:37 · 84 阅读 · 0 评论 -
【剑指Offer】47、求1+2+3+……+n
public class Solution { private int sum=0; public int Sum_Solution(int n) { boolean flag=(n>0)&&((sum=n+Sum_Solution(n-1))>0); return sum; } }原创 2019-10-13 18:05:13 · 108 阅读 · 0 评论 -
【剑指Offer】46、孩子们的游戏(圆圈中最后剩下的数)
约瑟夫环,圆圈长度为 n 的解可以看成长度为 n-1 的解再加上报数的长度 m。因为是圆圈,所以最后需要对 n 取 余。 public class Solution { public int LastRemaining_Solution(int n, int m) { if(n==0) return -1; if(n==1) return 0; ...原创 2019-10-12 22:53:53 · 103 阅读 · 0 评论 -
【剑指Offer】45、扑克牌顺子
function IsContinuous(numbers) { if(numbers.length!==5) return false; numbers=numbers.sort((a,b)=>a-b); var count=0; for(var i=0;i<5;i++){ if(numbers[i]===0) count++; ...原创 2019-10-12 22:19:29 · 89 阅读 · 0 评论 -
【剑指Offer】44、反转单词顺序
同样两次反转,先旋转每个单词,再旋转整个字符串。 function ReverseSentence(str) { var arr=str.split(""); var i=0,j=0,len=str.length; while(j<=len){ if(j===len||arr[j]===' ') { reverse(arr,...原创 2019-10-12 22:04:50 · 103 阅读 · 0 评论 -
【剑指Offer】43、左旋转字符串
先将 "abc" 和 "XYZdef" 分别翻转,得到 "cbafedZYX",然后再把整个字符串翻转得到 "XYZdefabc"。 原理:数学中的转置. 要特别注意字符串不可变,必须转为数组方可进行一系列操作,最后再将新数组join成一个新的字符串。 function LeftRotateString(str, n) { if(str===null||str.length===0...原创 2019-10-12 21:45:16 · 130 阅读 · 0 评论 -
【剑指Offer】37、数字在排序数组中出现的次数
function GetNumberOfK(data,k) { var position1=binarySearch(data,k); var position2=binarySearch(data,k+1); return position2-position1; } function binarySearch(data,k){ var left=0,right...原创 2019-10-09 20:07:49 · 103 阅读 · 0 评论 -
【剑指Offer】38、二叉树的深度
不二选择:递归~ public class Solution { public int TreeDepth(TreeNode root) { return root==null?0:1+Math.max(TreeDepth(root.left),TreeDepth(root.right)); } }原创 2019-10-09 20:16:44 · 83 阅读 · 0 评论 -
【剑指Offer】39、平衡二叉树
function IsBalanced_Solution(pRoot) { var flag=true; depth(pRoot); return flag; function depth(pRoot){ if(pRoot===null||!flag) return 0; var left=depth(pRoot.left); ...原创 2019-10-10 19:46:57 · 78 阅读 · 0 评论 -
【剑指Offer】40、数组中只出现一次的数字
记数组中存在的唯一的两个数字分别为a,b 首先以二进制的角度去看所有的数字,每一位均为0,1组成 对所有数字进行个位上的异或,成对相同的数字结果为0,每一位上都这样异或依次,所以最终每一位上存在1的则必然是因为a,b在这一位上不同 根据最终结果上存在‘1’的这一位,将原数组分为两组,一组‘1’,一组‘0‘, 两组数字再分别异或,最终两个结果就是a,b; 注意:负数在计算机中是以补码形式存...原创 2019-10-10 20:31:58 · 85 阅读 · 0 评论 -
【剑指Offer】41、 和为S的连续正数序列
双指针法,另外注意呀,连续序列的含义是至少有两个元素。 function FindContinuousSequence(sum) { var right=Math.floor(sum/2)+1; var res=[]; var start=1,end=2,cur_sum=3; while(end<=right){ if(cur_sum<...原创 2019-10-11 19:49:50 · 93 阅读 · 0 评论 -
【剑指Offer】42、和为S的两个数字
思想:双指针,之所以选择首位,是为了满足乘积最小的条件。 function FindNumbersWithSum(array, sum) { var left=0,right=array.length-1; while(left<right){ var temp=array[left]+array[right]; if(temp<su...原创 2019-10-11 20:21:45 · 75 阅读 · 0 评论 -
【剑指Offer】27、字符串的排列
回溯 function Permutation(str) { var res=[],len=str.length; if(len===0) return res; var arr=str.split('').sort(); var visited=new Array(len).fill(false); helper(res,[],arr,visited)...原创 2019-09-28 19:48:32 · 72 阅读 · 0 评论 -
【剑指Offer】10、矩形覆盖
一开始不小心把动态方程写错了,要注意排除重复情况。 相当以一个菲波那切数列数列,只是初始条件不一样。 public class Solution { public int RectCover(int target) { if(target<=2) return target; int[] dp=new int[target+1]; ...原创 2019-09-21 20:47:51 · 83 阅读 · 0 评论 -
【剑指Offer】36、两个链表的第一个公共节点
function FindFirstCommonNode(pHead1, pHead2) { var l1=pHead1,l2=pHead2; while(l1!==l2){ l1=l1===null?pHead2:l1.next; l2=l2===null?pHead1:l2.next; } return l1;...原创 2019-10-08 20:28:59 · 90 阅读 · 0 评论 -
【剑指Offer】35、数组中的逆序对
用到归并排序的思想,时间复杂度O(n*logn) 核心:[A,B]中的逆序对=A中的逆序对+B中的逆序对+[A,B]中"前后"逆序对。 function InversePairs(data) { var count=0; mergeSort(data,0,data.length-1); return count; function mergeSort(arra...原创 2019-10-08 20:04:45 · 87 阅读 · 0 评论 -
【剑指Offer】17、树的子结构
思路非常巧妙~ /* function TreeNode(x) { this.val = x; this.left = null; this.right = null; } */ function HasSubtree(pRoot1, pRoot2) { if(pRoot1===null||pRoot2===null) return false; ret...原创 2019-09-24 19:19:10 · 100 阅读 · 0 评论 -
【剑指Offer】16、合并两个排序的列表
以后,再也不要为了剩一点点空间而把问题复杂化!就再建一个链表就完了,别整那些花里胡哨。 /*function ListNode(x){ this.val = x; this.next = null; }*/ function Merge(pHead1, pHead2) { let head=new ListNode(-1); //勿直接赋值为null let r...原创 2019-09-22 21:34:03 · 106 阅读 · 0 评论 -
【剑指Offer】15、反转链表
function ReverseList(pHead) { if(pHead===null||pHead.next===null) return pHead; let pre=null,next=null; while(pHead!==null){ next=pHead.next; pHead.next=pre; pre=p...原创 2019-09-22 20:52:43 · 88 阅读 · 0 评论 -
【剑指Offer】14、链表中倒数第k个结点
双指针法,第二个指针一直原地不动,直到第一个指针超前自己(k-1)格,索引号相差的是k;但要注意k>节点数的情况,以及边界的确定。 function FindKthToTail(head, k) { let res=head; let all=0; while(head!==null){ all++; head=head.next;...原创 2019-09-22 20:26:55 · 104 阅读 · 0 评论 -
【剑指Offer】13、调整数组顺序使奇数位于偶数前面
先统计出奇数个数;再新建一个数组,弄俩个指针,blahblah~~ public class Solution { public void reOrderArray(int [] array) { int odd=0; for(int num:array){ if((num & 1)== 1)odd++; }...原创 2019-09-22 19:53:29 · 84 阅读 · 0 评论