
剑指Offer刷题
剑指Offer刷题
gxgalaxy
这个作者很懒,什么都没留下…
展开
-
剑指 Offer 46. 把数字翻译成字符串
我们可以使用动态规划来实现这个函数,定义dp[i]为前i个数字的翻译方法数,对于第i个数字,如果它和第i-1个数字组成的数字在10到25之间,那么它们就可以一起翻译成一个字母。因此,dp[i] = dp[i-1] + dp[i-2]。否则,它们必须分别翻译成字母,因此dp[i] = dp[i-1]。0 翻译成 “a” ,1 翻译成 “b”,……3种情况 -- 只需要计算 123的翻译情况 + 123和4组合的时候的翻译情况。3种情况 -- 只需要计算 12的翻译情况 + 12和3组合的时候的翻译情况。原创 2023-04-04 15:52:24 · 173 阅读 · 1 评论 -
JS 剑指 Offer 33. 二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。参考以下这颗二叉搜索树:示例 1:输入: [1,6,3,2,5]输出: false示例 2:输入: [1,3,2,6,5]输出: true二叉搜索树的后序遍历的特点:当前的最后一个数就是该二叉树的根节点,并且左子树的值<根节点<右子树的值。根据这个特点:找到该数组的最后一个数即为根节点。遍历该数组,找到第一个大于根节点的数原创 2020-09-12 18:59:34 · 327 阅读 · 0 评论 -
JS 剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7],返回其层次遍历结果:[[3],[20,9],[15,7]]在JS 剑指 Offer 32 - II. 从上到下打印二叉树 II的基础上加一个翻转的判断条件即可:/** * Definition for a binary tree node. * function原创 2020-09-09 20:25:13 · 230 阅读 · 0 评论 -
JS 剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7],返回其层次遍历结果:[[3],[9,20],[15,7]]思路:该题和JS 剑指 Offer 32 - I. 从上到下打印二叉树题目类似,只是在最后结果输出的时候相对复杂一些。定义count来表示当前遍历的树的层数list用来保存树的节点result用来保存最终的结果countNum用来表示第count层节点的数量count =原创 2020-09-09 16:04:30 · 310 阅读 · 0 评论 -
JS 剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7],返回:[3,9,20,15,7]思路:广度优先遍历当节点不存在时,返回 []当节点存在时,定义两个数组,list数组用来保存树的节点,result数组用来保存最后的结果。每次取出list的第一个节点保存在temp中,将它的value值push进result数组中,然后判断该节点左右子节点是否存在,存在就push进入list的最后面。重复进行,直到原创 2020-09-09 15:28:06 · 207 阅读 · 0 评论 -
JS 剑指 Offer 11. 旋转数组的最小数字
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0二分法numbers[mid] > numbers[right] 表明最小值在当前区间右半边,因此left右移numbers[mid] < numbers[ri原创 2020-07-22 12:05:59 · 218 阅读 · 0 评论 -
JS 剑指 Offer 57 - II. 和为s的连续正数序列 滑动窗口法
输入一个正整数 target ,输出所有和为 target 的连续正整数序列(至少含有两个数)。序列内的数字由小到大排列,不同序列按照首个数字从小到大排列。示例 1:输入:target = 9输出:[[2,3,4],[4,5]]示例 2:输入:target = 15输出:[[1,2,3,4,5],[4,5,6],[7,8]]分析定义两个指针,left和right指向数组的第一位,定义一个mid=target/2,由于序列内的数字由小到大排列,如果在mid之前都没有满足条件的那么在m原创 2020-07-14 21:31:17 · 159 阅读 · 0 评论 -
JS 剑指 Offer 59 - I. 滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7]解释:滑动窗口的位置 最大值[1 3 -1] -3 5 3 6 7 31 [3 -1 -3] 5 3 6 7 31 3 [-1 -3 5] 3 6 7 51 3 -1 [-3 5 3] 6原创 2020-07-14 21:05:36 · 136 阅读 · 0 评论 -
JS 剑指 Offer 64. 求1+2+…+n
求 1+2+…+n ,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。示例 1:输入: n = 3输出: 6示例 2:输入: n = 9输出: 45不能使用for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)那么求和公式 (n(n+1))/2 不可取,可以使用&&的短路运算来进行求解 0 && n =0,1&&1 =1, 2&原创 2020-07-14 16:17:40 · 179 阅读 · 0 评论 -
JS 剑指 Offer 53 - II. 0~n-1中缺失的数字 二分法
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。示例 1:输入: [0,1,3]输出: 2示例 2:输入: [0,1,2,3,4,5,6,7,9]输出: 8二分法情况1:数组中都是有序的,例如[0,1,2] 那么缺少的是3,这种情况只需要return nums.length情况2:数组中间有缺失的数字,可以通过二分法找出缺失的数字,根据数组的下标是连续且递增的,通过判断原创 2020-07-11 17:33:54 · 219 阅读 · 0 评论 -
JS 剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2方法1 哈希解题思路:利用对象的特性将数组中的数出现的次数统计出来,然后遍历数组,返回出现次数超过数组长度1/2的数。/** * @param {number[]} nums * @return {number} */var majorityElement = function(num原创 2020-07-10 11:16:49 · 413 阅读 · 0 评论 -
JS 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。解题思路参考:数组中重复的数字示例:s = “abaccdeff”返回 “b”s = “”返回 " "var firstUniqChar = function(s) { if(s === '') return " "; var obj = {}; var len = s.length; for(let i = 0 ; i < len; i++){原创 2020-06-14 17:20:10 · 922 阅读 · 0 评论 -
JS 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. “,则输出"student. a am I”。示例 1:输入: “the sky is blue”输出: “blue is sky the”示例 2:输入: " hello world! "输出: “world! hello”解释: 输入字符串可以在前面或者后面包含多余的空格,但是反转后的字符不能包括。示例 3:输入: “a go.原创 2020-05-20 22:32:50 · 1486 阅读 · 0 评论 -
JS和为s的两个数字
输入一个递增排序的数组和一个数字s,在数组中查找两个数,使得它们的和正好是s。如果有多对数字的和等于s,则输出任意一对即可。示例 1:输入:nums = [2,7,11,15], target = 9输出:[2,7] 或者 [7,2]示例 2:输入:nums = [10,26,30,31,47,60], target = 40输出:[10,30] 或者 [30,10]分析:刚开始采用直接暴力解法,从数组的0位开始,使用temp = target - nums[0];得到另外一个可能需要.原创 2020-05-20 20:52:39 · 282 阅读 · 0 评论 -
JS左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = “abcdefg”, k = 2输出: “cdefgab”示例 2:输入: s = “lrloseumgh”, k = 6输出: “umghlrlose”分析:使用slice方法将字符串切割成两部分,再按照题意拼接。var reverseLeftWords =.原创 2020-05-20 19:55:41 · 494 阅读 · 0 评论 -
JS二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。例如输入:镜像输出:分析:将树中的每一个子树的左右子树交换var mirrorTree = function(root) { if(!root) return null; let tmp = root.left; root.left = mirrorTree(root.right) root.right = mirrorTree(tmp) return root;};...原创 2020-05-19 19:40:25 · 480 阅读 · 0 评论 -
JS合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4分析:如果l1 = null,返回l2如果l2 = null,返回l1如果l1 = null && l2 == null,返回null如果l1 l2都不为空,从头开始比较,如果l1.val < l2.val将l1.val添加到新链表中,在将l1.nex.原创 2020-05-19 16:44:59 · 639 阅读 · 1 评论 -
JS链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5.分析:定义两个指针first second,先令first先走k步,然后first second同时向后移动,直到first == null停止.原创 2020-05-19 10:59:57 · 976 阅读 · 0 评论 -
JS调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4]注:[3,1,2,4] 也是正确的答案之一。分析:我们可以新建两个空数组,其中一个用来存放奇数,另外一个用来存放偶数,最后使用concat方法将两个数组拼接起来。var exchange = function(nums) { var arr1 = []; var arr2 = []; .原创 2020-05-18 22:02:49 · 542 阅读 · 0 评论 -
JS二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 ‘1’。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 0000000000.原创 2020-05-18 21:50:50 · 736 阅读 · 3 评论 -
JS打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]分析:本题主要考察的是求10的次方var printNumbers = function(n) { var len = Math.pow(10,n); var arr = []; for(var i = 1; i < len; i++){ arr.原创 2020-05-18 21:23:00 · 418 阅读 · 0 评论 -
JS 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21分析:当n=1时结果为1当n=2时结果为2当n=3时结果为3当n=4时结果为5当n=5时结果为8…可以得到规律当n>=3时有 f(3) = f(2) + f(1)即f(n) = f(n-1) + .原创 2020-05-18 21:03:17 · 467 阅读 · 0 评论 -
JS旋转数组的最小数字(sort,快速排序,冒泡排序)
把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个旋转,该数组的最小值为1。示例 1:输入:[3,4,5,1,2]输出:1示例 2:输入:[2,2,2,0,1]输出:0分析:这个题意思就是找出数组中的最小值。方法一:利用sort()函数var minArray = function(numbers) { var arr = number.原创 2020-05-18 20:23:26 · 157 阅读 · 0 评论 -
JS替换空格(正则,split + join)
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = “We are happy.”输出:“We%20are%20happy.”方法1:循环var replaceSpace = function(s) { var str = ''; var temp = ''; for(var i = 0; i < s.length; i ++){ temp = s.charAt(i); if(s.charAt(.原创 2020-05-18 16:42:35 · 478 阅读 · 0 评论 -
JS 在排序数组中查找数字 I (穷举法 二分法)
统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0方法一:一开始想采取前面数组去重的方法,现将数组中每个数字出现的次数统计出来放在对象中,可以通过Object.keys(obj)将对象中的属性名获取出来存放在arr数组中,然后通过一一对比数组里面的值和target是否相等,如果相等输出对象中该属性名的属性值,这里.原创 2020-05-18 12:37:48 · 668 阅读 · 0 评论 -
JS二叉树的深度
题目:输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7],返回它的最大深度 3 。解题思路:当树为空,深度为0;当树不为空,深度为左右子树中深度的最大值,加上这个节点本身所占的层数(1)。/** * Definition for a binary tree node. * function TreeNode(val) { * t.原创 2020-05-16 16:52:35 · 1643 阅读 · 0 评论 -
JS反转链表
题目:定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL、解题思路:当节点数为0或者为1的时候直接返回头结点 当节点数为2的时候,例如5->4->null,此时需要返回的根节点是4,因此先将4保存下来,使4的下一个节点为5即head.next.next = head;再使5指向null即head原创 2020-05-16 12:51:16 · 440 阅读 · 0 评论 -
JS删除链表的节点
题目给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9./** * Definition for singly-linked list. * function ListNode(val) { * this.val = val;.原创 2020-05-16 12:27:35 · 1437 阅读 · 0 评论 -
JS重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如:前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:解题思路:首先通过前序遍历结果获取根节点(前序遍历的第一个值就是树的根节点),然后通过中序遍历区分左右子树,再分别对左右子树重复上述操作。/** * Definition for a binary tree node. * func原创 2020-05-16 11:50:22 · 191 阅读 · 0 评论 -
JS 从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)示例 1:输入:head = [1,3,2]输出:[2,3,1]解题思路:利用数组的reverse()函数实现从尾到头打印链表。先将链表的节点保存在arr中,然后通过reverse()实现逆序。/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null; *原创 2020-05-16 10:44:16 · 237 阅读 · 0 评论 -
JS-合并两个有序数组
给你两个有序整数数组 nums1 和 nums2,请你将 nums2 合并到 nums1 中,使 nums1 成为一个有序数组。说明:初始化 nums1 和 nums2 的元素数量分别为 m 和 n 。你可以假设 nums1 有足够的空间(空间大小大于或等于 m + n)来保存 nums2 中的元素。示例:输入:nums1 = [1,2,3,0,0,0], m = 3nums2 = [2,5,6], n = 3输出: [1,2,2,3,5,6]题目要求不neg/**原创 2020-05-11 21:25:39 · 362 阅读 · 0 评论 -
JS-数组中重复的数字
这里写自定义目录标题找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 解题思路: 根据前面学习的数组去重的方法延伸而来的。数组去重使用哈希方法,利用对象的属性的特点,属性名是唯一的,循环遍历数组中的数,将他们作为属性名添加到对象中,如果属性名已经存在了就表明这原创 2020-05-11 21:16:58 · 1423 阅读 · 0 评论