
剑指OFFER(JS版)
文章平均质量分 64
剑指OFFER(JS版)
quan!!!
这个作者很懒,什么都没留下…
展开
-
剑指OFFER----3-1、数组中重复的数字(js实现)
题目在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。思路利用对象或者散列表或者下标检测// 解法1:下标检测function duplicate(numbers, du...原创 2019-06-30 22:10:39 · 456 阅读 · 0 评论 -
剑指OFFER----3-2、不修改数组找出重复的数字(js实现)
题目找出数组中重复的数字。 在一个长度为 n+1 的数组 nums 里的所有数字都在 1~n 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。不能修改原数组,请找出数组中任意一个重复的数字。 示例 1: 输入:[2, 3, 5, 3, 2, 6, 7] 输出:2 或 3思路二分查找的思想。对于每段数 如1-4、5-8,当在原数组中出现的次数大于他那一段的长度,则表示当前段有重复数字。详解看剑指OFFER原版解析/*** @param {nu..原创 2021-07-03 11:23:46 · 271 阅读 · 0 评论 -
剑指OFFER----4、二维数组中的查找(js实现)
题目在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。思路通过右上角数的对比function Find(target, array){ // write code here if (!target || !array || ar...原创 2019-07-07 16:43:02 · 376 阅读 · 0 评论 -
剑指OFFER----5、替换空格(js实现)
请实现一个函数,将一个字符串中的空格替换成“%20”。例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy。思想:正则替换function replaceSpace(str) { return str.replace(/\s/g, '%20');}...原创 2019-03-06 20:10:48 · 381 阅读 · 0 评论 -
剑指OFFER----6、从尾部打印链表(js实现)
思想:利用unshift往前面添加元素function LinkList() { var Node = function(element) { this.element = element; this.next = null; }; this.head = null; this.length = 0; if(typeof ...原创 2019-03-06 20:29:30 · 191 阅读 · 0 评论 -
剑指OFFER----7、重建二叉树(js实现)
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回function reConstructBinaryTree(pre, vin) { if (pre.length === 0 || vin.length ...原创 2019-03-06 21:08:19 · 314 阅读 · 0 评论 -
剑指OFFER----8、二叉树的下一个结点(js实现)
题目给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路刚开始的思路是:叶子结点和非叶子结点分别处理,后面思路是分左右孩子处理,发现很多重复代码,最终思路为:有无右孩子为判断条件,有右孩子则返回右孩子的最左孩子,无右孩子则看有无父节点,若没父节点是根节点,则返回null,如果有父节点,则看这个节点是父节点...原创 2019-07-03 17:19:20 · 341 阅读 · 0 评论 -
剑指OFFER----9、两个栈实现队列(js实现)
用两个栈来实现一个队列,完成队列的Push和Pop操作。 队列中的元素为int类型。思想:栈是先进后出,队列是先进先出,因此两个栈,一个用来push,一个用来pop,同时注意下两个栈不为空的时候。var outStack = [], inStack = [];function push(node) { inStack.push(node);}function pop() { ...原创 2019-03-06 21:21:05 · 202 阅读 · 0 评论 -
剑指OFFER----10-1、斐波那契数列(js实现)
斐波那契数列数列从第3项开始,每一项都等于前两项之和。例子:数列 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233,377,610,987,1597,2584,4181,6765,10946,17711,28657,46368…// 递归实现function Fibonacci(n) { if (n >= 0) { i...原创 2019-03-06 22:41:32 · 590 阅读 · 0 评论 -
剑指OFFER----10-2、青蛙跳台阶问题(js实现)
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析:题目很简单,稍微分析就知道这是斐波那契数列,所以可以动态规划来做a.如果两种跳法,1阶或者2阶,那么假定第一次跳的是一阶,那么剩下的是n-1个台阶,跳法是f(n-1);b.假定第一次跳的是2阶,那么剩下的是n-2个台阶,跳法是f(n-2)c.由a\b假设可以得出总跳法为: f(n) = f(n...原创 2019-03-06 22:53:22 · 698 阅读 · 0 评论 -
剑指OFFER----10-3、青蛙跳台阶问题变态版(js实现)
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。分析: 这里的f(n) 代表的是n个台阶有一次1,2,…n阶的 跳法数。n = 1时,只有1种跳法,f(1) = 1n = 2时,会有两个跳得方式,一次1阶或者2阶,这回归到了问题(1) ,f(2) = f(2-1) + f(2-2)n = 3时,会有三种跳得方式,...原创 2019-03-07 11:04:16 · 683 阅读 · 0 评论 -
剑指OFFER----10-4、矩阵覆盖(js实现)
题目我们可以用21的小矩形横着或者竖着去覆盖更大的矩形。请问用n个21的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?思路其实就是斐波那契数列的变形function rectCover(number){ // write code here if (number <= 2) { return number } let o...原创 2019-07-07 12:14:54 · 229 阅读 · 0 评论 -
剑指OFFER----11、旋转数组中的最小数字(js实现)
题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。思路:(1)我们用两个指针left,right分别指向数组的第一个元素和最后一个元素。按照题目的旋转的规则,第...原创 2019-03-07 11:43:37 · 311 阅读 · 0 评论 -
剑指OFFER----12、矩阵中的路径(js实现)
题目请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。举例分析例如在下面的 3*4 的矩阵中包含一条字符串“bcced”的路径。但矩阵中不包含字符串“abcb”的路径,因为字符串的第一个字符 b 占据了矩阵中的第一行第二格子之后...原创 2019-07-10 19:20:22 · 576 阅读 · 0 评论 -
剑指OFFER----13、机器人的运动范围(js实现)
题目地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?...原创 2019-07-10 19:21:57 · 259 阅读 · 0 评论 -
剑指OFFER----14、剪绳子(js实现)
题目给你一根长度为n的绳子,请把绳子剪成m段(m , n )都是正整数,(n>1&m>1)每段绳子的长度为k[0],k[1],k[2],…,k[m]。请问k[0]k[1]k[2]…k[m]的最大值。例如绳子是长度为8,我们把它剪成的长度分别为2,3,3的三段,此时得到的最大的乘积是18。思路动态规划。先从最低处开始计算乘积并将每个数可以剪切后得到的成绩最大值进行存储...原创 2019-07-07 21:27:56 · 642 阅读 · 1 评论 -
剑指OFFER----15、输出数二进制1的个数(js实现)
如果一个整数不为0,那么这个整数至少有一位是1。如果我们把这个整数减1,那么原来处在整数最右边的1就会变为0,原来在1后面的所有的0都会变成1(如果最右边的1后面还有0的话)。其余所有位将不会受到影响。举个例子:一个二进制数1100,从右边数起第三位是处于最右边的一个1。减去1后,第三位变成0,它后面的两位0变成了1,而前面的1保持不变,因此得到的结果是1011.我们发现减1的结果是把最右边的一...原创 2019-04-04 21:34:00 · 174 阅读 · 0 评论 -
剑指OFFER----16、数值的整数次方(js实现)
function Power(base, exponent){ // write code here return Math.pow(base, exponent)}原创 2019-04-04 21:19:05 · 446 阅读 · 0 评论 -
剑指OFFER----17、打印从1到最大的n位数(js实现)
题目输入数字n,按顺序打印出从1到最大的n位十进制数。比如输入3,则打印出1、2、3一直到最大的3位数即999。思路原创 2019-07-10 19:58:35 · 509 阅读 · 0 评论 -
剑指OFFER----18-1、在O(1)时间内删除链表节点(js实现)
题目给定单向链表的头指针head和一个节点指针p,定义一个函数在O(1)时间删除该节点p。思路原创 2019-07-10 19:58:31 · 276 阅读 · 0 评论 -
剑指OFFER----18-2、删除链表中重复的结点(js实现)
题目在一个排序的链表中,存在重复的结点,请删除该链表中重复的结点,重复的结点不保留,返回链表头指针。 例如,链表1->2->3->3->4->4->5 处理后为 1->2->5思路递归法和非递归法// 递归法function deleteDuplication(pHead) { if (pHead == null || pHead....原创 2019-07-03 16:00:41 · 463 阅读 · 0 评论 -
剑指OFFER----19、正则表达式匹配(js实现)
题目请实现一个函数用来匹配包括’.‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(包含0次)。 在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但是与"aa.a"和"ab*a"均不匹配思想当模式中的第二个字符不是“*”时:如果字符串第一个字符和模式中的第一个字符相匹配,那么字符串...原创 2019-07-09 11:27:39 · 360 阅读 · 0 评论 -
剑指OFFER----20、表示数值的字符串(js实现)
题目请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100",“5e2”,"-123",“3.1416"和”-1E-16"都表示数值。 但是"12e",“1a3.14”,“1.2.3”,"±5"和"12e+4.3"都不是。思路只能出现这几种字符,e E + - . ‘0’ - ‘9’,且针对不同字符有不一样的规则一、针对e e不能出现在末尾,且只能出现一次二......原创 2019-07-02 18:24:28 · 323 阅读 · 0 评论 -
剑指OFFER----21、调整数组顺序使奇数位于偶数前面 (js实现)
function reOrderArray(array) { var jiArr = []; var ouArr = []; for (let i = 0; i < array.length; i++) { if (array[i] % 2 == 0) { ouArr.push(array[i]); } else...原创 2019-03-07 12:13:16 · 258 阅读 · 0 评论 -
剑指OFFER----22、链表中倒数第K个节点(js实现)
题目输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有 6 个节点,从头节点开始,它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点。leetcode链接:https://leetcode-cn.com/problems/lian-biao-zhong-dao-shu-di-kge-jie-dian-lcof/思路队列快慢指针,快指针先走k-1步,之后快慢指针同步走,走到快原创 2019-03-07 14:02:20 · 742 阅读 · 0 评论 -
剑指OFFER----23、链表中环的入口结点(js实现)
题目给一个链表,若其中包含环,请找出该链表的环的入口结点,否则,输出null。思路首先看图找规律:(有快慢指针,速度为2倍)假设x为环前面的路程(黑色路程),a为环入口到相遇点的路程(蓝色路程,假设顺时针走), c为环的长度(蓝色+橙色路程)当快慢指针相遇的时候:此时慢指针走的路程为:Sslow = x + m * c + a此时快指针走的路程为:Sfast = x + n * ...原创 2019-07-02 20:20:12 · 381 阅读 · 0 评论 -
剑指OFFER----24、翻转链表 (js实现)
利用三个指针/*function ListNode(x){ this.val = x; this.next = null;}*/function ReverseList(pHead){ // write code here let pPrev = null; let pNext = null; while(pHead !== null) {...原创 2019-03-07 13:48:37 · 282 阅读 · 0 评论 -
剑指OFFER----25、合并两个排序的链表 (js实现)
题目输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。function Merge(pHead1, pHead2) { // write code here var Head = null; if (pHead1 == null || pHead2 == null) { return pHead1 || pHea...原创 2019-03-07 14:39:41 · 538 阅读 · 0 评论 -
剑指OFFER----26、树的子结构(js实现)
题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)题目分析:分析如何判断树B是不是树A的子结构,只需要两步。很容易看出来这是一个递归的过程。一般在树的求解方面都和递归有关。Step1.在树A中找到和B的根结点的值一样的结点R;Step2.判断树A中以R为根结点的子树是不是包含和树B一样的结点。function HasSubtree(pRoo...原创 2019-03-07 16:28:04 · 264 阅读 · 0 评论 -
剑指OFFER----27、二叉树的镜像(js实现)
题目请完成一个函数,输入一个二叉树,该函数输出它的镜像。leetcode链接:[https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/](https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/)代码/** * Definition for a binary tree node. * function TreeNode(val) { * t原创 2021-09-01 19:53:40 · 187 阅读 · 0 评论 -
剑指OFFER----28、对称的二叉树(js实现)
题目请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路边界条件判断递归法判断节点的左子树和右子树情况function isSymmetrical(pRoot) { // write code here if (!pRoot) { return true } return...原创 2019-07-03 17:36:22 · 281 阅读 · 0 评论 -
剑指OFFER----29、顺时针打印矩阵(js实现)
题目题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1 2 3 45 6 7 89 10 11 1213 14 15 16则依次打印出数字1、2、3、4、8、12、16、15、14、13、9、5、6、7、11、10。思路...原创 2019-07-10 20:21:29 · 571 阅读 · 0 评论 -
剑指OFFER----30、包含main函数的栈(js实现)
题目定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求函数min、push以及pop的时间复杂度都是O(1)。思路原创 2019-07-10 19:58:23 · 209 阅读 · 0 评论 -
剑指OFFER----31、栈的压入,弹出序列 (js实现)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。(注意:这两个序列的长度是相等的)function IsPopOrder(pushV, popV){ // write ...原创 2019-04-04 22:12:57 · 361 阅读 · 0 评论 -
剑指OFFER----32-1、从上往下打印二叉树 (js实现)
从上往下打印出二叉树的每个节点,同层节点从左至右打印。/* function TreeNode(x) { this.val = x; this.left = null; this.right = null;} */function PrintFromTopToBottom(root) { //write code here if(root === nu...原创 2019-04-05 19:08:08 · 323 阅读 · 0 评论 -
剑指OFFER----32-2、把二叉树打印成多行(js实现)
题目从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路利用队列的特性,并且每一轮都删除queue旧的数据function Print(pRoot) { // write code here if (!pRoot) { return [] } let result = [] let queue = [] queue.push(pRoot)...原创 2019-07-03 18:33:48 · 295 阅读 · 0 评论 -
剑指OFFER----32-3、按之字形顺序打印二叉树(js实现)
题目请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路队列按情况反转rowfunction Print(pRoot) { // write code here if (!pRoot) { return [] } let result = []...原创 2019-07-03 20:17:31 · 218 阅读 · 0 评论 -
剑指OFFER----33、二叉搜索树的后序遍历序列(js实现)
题目输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。思路...原创 2019-07-10 19:35:50 · 292 阅读 · 0 评论 -
剑指OFFER----34、二叉树中和为某一值的路径(js实现)
题目输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。二叉树结点的定义如下:node : { val, left, right}思路...原创 2019-07-10 19:58:12 · 374 阅读 · 0 评论 -
剑指OFFER----35、复杂链表的复制(js实现)
题目输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)思路...原创 2019-07-10 19:51:42 · 432 阅读 · 0 评论