![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
JZoffer
七月是我的生日
人生太苦,但你要甜!
展开
-
剑指offer(JS版刷题) git仓库
每个题有对应的题解和代码,代码均为 javascript 版本。git仓库地址:javascript 版 剑指offer刷题库原创 2021-03-01 20:19:45 · 291 阅读 · 0 评论 -
算法: 时间复杂度&&空间复杂度
时间复杂度为O(1)的例子(1) if(i === 1)(2) a = 1 | result = 3 + 4 | result = n*2 | result = 1000*1000(3) array.push('a') array.pop()(4) map.set(1,1) map.get(1,1)在计算复杂度的时候,O(1)一般会被忽略。时间复杂度O(n)的操作(1) for(let i = 0; i < n : i++)(2) while(n)时间复杂度O(n^原创 2021-02-10 16:46:58 · 385 阅读 · 0 评论 -
JZ 29-最小的K个数(JS)
题目描述:最小的K个数输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。题目解析:想法比较简单,先用新数组存储一下input进来的数字,之后冒泡排序从小到大排序,完事遍历1-k,将其push进新数组。最后return 新数组。function GetLeastNumbers_Solution(input, k){ // write code here var arrList = [...input].原创 2020-07-15 21:14:20 · 271 阅读 · 0 评论 -
JZ 31-整数中1出现的次数(JS)
题目描述:整数中1出现的次数求出113的整数中1出现的次数,并算出1001300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。题目解析:我的想法是,将数组进行遍历,将数字转换为字符串,通过字符串的charAt方法判断每一个字符。function NumberOf1Between1.原创 2020-07-15 21:09:44 · 234 阅读 · 0 评论 -
JZ 28 -数组中出现超过一半的数字(JS)
题目描述:数组中出现一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。题目解析:利用js对象的属性不能重复的特性。遍历数组中的数字;将每个数字作为对象的属性,存进对象当第二次出现某个数字就将这个属性+1.最后通过 for in 判断。function MoreThanHalfNum_Solution(numbe.原创 2020-07-14 21:49:48 · 337 阅读 · 0 评论 -
JZ 24-二叉树中和为某一值的路径(JS)
题目描述:二叉树中和为某一值的路径输入一颗二叉树的根节点和一个整数,按字典序打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。题目解析:/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function FindPath(root, expectNumber){ // write .原创 2020-07-14 21:36:19 · 212 阅读 · 0 评论 -
JZ 23 -二叉树的后序遍历(JS)
题目描述:二叉树的后序遍历输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。题目解析:只需要不断地确定出左子树区间和右子树区间,并且判断:左子树区间的所有结点值 < 根结点值 < 右子树区间所有结点值,这个条件是否满足即可function VerifySquenceOfBST(sequence){ // write code here if (sequence.leng.原创 2020-07-13 21:58:53 · 192 阅读 · 0 评论 -
JZ22 -从上往下打印二叉树(JS)
题目描述:从上往下打印二叉树从上往下打印出二叉树的每个节点,同层节点从左至右打印。题目解析:利用队列的先进先出的特性。利用辅助队列,将root,push进辅助队列,之后每次去除辅助队列的第一个元素进行,存值,并且对其左右节点进行判断。完整代码:/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function PrintFromTopToBot.原创 2020-07-12 21:47:38 · 488 阅读 · 0 评论 -
JZ21 -栈的压入、弹出
题目描述:栈的压入、弹出输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)题目解析:对于入栈顺序1,2,3,4,5.出栈顺序4,5,3,2,1 合格的入栈出栈顺序如下:1 入栈,2 入栈, 3 入栈, 4 入栈, 4 出栈,5 入栈,5出栈.原创 2020-07-12 21:07:32 · 158 阅读 · 0 评论 -
JZ20 - 包含main函数的栈
题目描述:包含main函数的栈定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1))。注意:保证测试中不会当栈为空的时候,对栈调用pop()或者min()或者top()方法。题目解析;const stack1 = []const stack2 = []function push(node){ // write code here if (stack1.length == 0){ stack1.push(n.原创 2020-07-12 20:40:50 · 453 阅读 · 0 评论 -
JZ19 -顺时针打印螺旋矩阵(JS)
题目描述:顺时针打印螺旋矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下4 X 4矩阵: 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){ // write code here let list = []; if(matrix.length.原创 2020-07-09 15:23:18 · 436 阅读 · 0 评论 -
JZ18 -二叉树的镜像(JS)
题目描述:二叉树的镜像操作给定的二叉树,将其变换为源二叉树的镜像。题目分析:我们直接交换二叉树的左右子树,然后递归调用就ok了。/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function Mirror(root){ // write code here if(root == null) return; var temp .原创 2020-07-08 18:36:58 · 208 阅读 · 0 评论 -
JZ17 -树的子结构(JS)
题目描述:树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题目分析:子树:子树的意思是包含了一个结点,就得包含这个结点下的所有节点,一棵大小为n的二叉树有n个子树,就是分别以每个结点为根的子树。子结构的意思是包含了一个结点,可以只取左子树或者右子树,或者都不取。其实思路应该分为两步:1.在大树中找到和小树根节点相同的节点。2.然后以此节点为根节点,在大树上往下搜索对比小书左右节点是否相同,不同则返回false3.如果2步中最后返.原创 2020-07-08 18:29:51 · 251 阅读 · 0 评论 -
JZ16 --合并两个排序链表(JS)
题目描述:合并两个排序链表输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。题目解析:function Merge(pHead1, pHead2){ // write code here let vHead = new ListNode(-1); let pre = vHead; while(pHead1 && pHead2){ if(pHead1.val < pHe.原创 2020-07-07 00:21:38 · 654 阅读 · 0 评论 -
JZ15 -链表反转(JS)
题目描述:链表反转输入一个链表,反转链表后,输出新链表的表头。题目解析:牛客解题,很完美!题目所给的是单链表,想了一下反转后的样子:最后一个结点指向倒数第二个,倒数第二个指向倒数第三个,…,第二个指向第一个,第一个指向null;知道了反转后各个结点指向哪之后,就需要开始调整每个结点的next指针。这就需要把结点挨个从链表上摘下来,做调整;这个调整过程需要两个指针辅助:pre记录其前一个结点位置,好让该结点的next指针指向前一个结点,但是在指向前一个结点前需要用一个指针p记录后一.原创 2020-07-04 00:18:47 · 1994 阅读 · 0 评论 -
JZ14 -链表中倒数第k个结点(JS)
题目描述:链表中倒数第k个结点输入一个链表,输出该链表中倒数第k个结点。题目解析:遍历链表节点,存进数组,然后返回数组的 length - k 个元素即可。/*function ListNode(x){ this.val = x; this.next = null;}*/function FindKthToTail(head, k) { var node_Arr = []; if(head == null || k < 0){ r.原创 2020-07-03 00:23:19 · 166 阅读 · 0 评论 -
JZ13 -调整数组数值顺序(JS)
题目描述:调整数组数值顺序输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。题目解析:function reOrderArray(array){ //设置两个数组分别用来存储偶数和奇数 var newArr1 = []; var newArr2 = []; for(var i = 0; i < array.length; i++){ .原创 2020-07-01 23:12:43 · 558 阅读 · 0 评论 -
JZ12 - 数值的整数次方(JS)
题目描述: 数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。保证base和exponent不同时为0题目解析function Power(base, exponent){ 1 //指数为0,结果为1 if (exponent === 0) { return 1; } //质数为1,返回base if (exponent === 1) { retur.原创 2020-07-01 23:04:31 · 157 阅读 · 0 评论 -
JZ11 -二进制中1的个数(JS)
题目描述:二进制中1的个数输入一个整数,输出该数32位二进制表示中1的个数。其中负数用补码表示。题目解析:function NumberOf1(n){ if(n<0){ n = n>>>0; //get到新技能,该行命令能够获取到负数的补码 } var res = n.toString(2); var count = 0; for(var i = 0; i <res.length; i++).原创 2020-06-30 19:47:13 · 2233 阅读 · 0 评论 -
JZ10 -矩形覆盖问题(JS)
题目描述:矩形覆盖问题我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2n的大矩形,总共有多少种方法?比如n=3时,23的矩形块有3种覆盖方法:题目解析:当n = n,可以分为两种情况来讨论,(1)第一次用一个21的小矩形作为第一个格,那么剩下2(n-1)个矩形等待填充。(2)第一次用一个12的小矩形作为第一个填充的矩形,下面的那个小矩形是必然要进行填充的,那么剩下2(n-2)个小矩形等待填充,所以n = n的情况总的方法为两种情况相加。 .原创 2020-06-30 19:32:30 · 2217 阅读 · 0 评论 -
JZ09 -变态跳台阶问题(JS)
题目描述:变态跳台阶问题一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。题目解析F(n) = F(n-1) + F(n-2) + F(n-3) + F(n-4) + … + F(2) + F(1)F(n-1) = F(n-2) + F(n-3) + F(n-4) + … + F(2) + F(1)F(n) = 2 F(n-1)function jumpFloorII(number){ if(number &.原创 2020-06-29 18:49:34 · 1970 阅读 · 0 评论 -
JZ08 - 跳台阶问题(JS)
题目描述:跳台阶问题一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。题目解析function jumpFloor(number){ //我们发现跳台阶实际上也是个fibonaci数列 if(number < 2){ return number; } else{ let before = 0; let after = 1; fo.原创 2020-06-29 18:36:09 · 1677 阅读 · 0 评论 -
JZ07 -斐波那契数列(JS)
题目描述:斐波那契数列大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项(从0开始,第0项为0,第1项是1)。n<=39题目解析:function Fibonacci(n){ //fibonaci 公式 F(0) = 0 F(1) = 1 F(2) = 1 // F(n) = F(n-1) + F(n-2) let before = 0; let after = 1; for(let i = 0 ; i &l.原创 2020-06-28 23:42:55 · 207 阅读 · 0 评论 -
JZ06 -旋转数组的最小数字(JS)
题目描述:旋转数组的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目解析:function minNumberInRotateArray(rotateArray){ //判断数组大小是否为0 if(rotateArray.length.原创 2020-06-28 23:27:00 · 709 阅读 · 6 评论 -
JZ05 -用两个栈实现一个队列(JS)
题目描述:用两个栈实现一个队列用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。题目解析 //用两个栈来实现一个队列 let inStack = []; let outStack = []; function push(node){ //判断辅助栈outStck中还有没有元素 while(outStack.length !== 0){ .原创 2020-06-27 18:14:12 · 240 阅读 · 0 评论 -
JZ04 -重建二叉树(JS)
题目描述:重建二叉树输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。题目解析function reConstructBinaryTree(pre, vin) { //如果先序遍历和中序遍历的长度均为0,那么返回null if (pre.length == 0 || vin..原创 2020-06-22 21:48:40 · 144 阅读 · 0 评论 -
JZ03 -从尾到头打印链表(JS)
题目描述:从尾到头打印链表输入一个链表,按链表从尾到头的顺序返回一个ArrayList。题目解析/*function ListNode(x){ this.val = x; this.next = null;}*/function printListFromTailToHead(head){ var current = head; var arr = []; while(current){ arr.push(current.原创 2020-06-20 16:28:32 · 151 阅读 · 0 评论 -
JZ02 - 替换空格(JS)
题目描述:请实现一个函数,将一个字符串中的每个空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。题目解析:方法1:function replaceSpace(str) { var char = null; var arr = []; for(var i in str){ arr.push(str.charAt(i)); .原创 2020-06-19 23:18:25 · 274 阅读 · 0 评论 -
JZ01 -二维数组中的查找(JS)
题目介绍:滑动窗口最大值问题在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。加入知识分享 : JS定义和赋值二维数组定义二维数组var array = [];var rowCount = 3; //定义二维数组的行数var colCount = 3; //定义二维数组的列数for(var i = 0 ; i < rowCoun.原创 2020-06-18 19:54:22 · 809 阅读 · 2 评论 -
JZ64 -滑动窗口最大值问题(JS)
**题目介绍:滑动窗口最大值问题**给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2原创 2020-06-08 13:20:37 · 244 阅读 · 0 评论