剑指Offer
大大大石頭
各种小白,记录点滴,慢慢学习
展开
-
【剑指 Offer 65】不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2 提示:a, b 均可能是负数或 0结果不会溢出 32 位整数/** * @param {number} a * @param {number} b * @return {number} */var add = function(a, b) { while(b != 0){ let temp = a ^ b; //除去相原创 2020-08-31 19:17:29 · 100 阅读 · 0 评论 -
【剑指 Offer 66】构建乘积数组
给定一个数组 A[0,1,…,n-1],请构建一个数组 B[0,1,…,n-1],其中 B 中的元素 B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1]。不能使用除法。示例:输入: [1,2,3,4,5]输出: [120,60,40,30,24]提示:所有元素乘积之和不会溢出 32 位整数a.length <= 100000/** * @param {number[]} a * @return {number[]} */var construct原创 2020-08-31 19:15:18 · 71 阅读 · 0 评论 -
【剑指 Offer 67】把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一个非空原创 2020-08-31 10:46:29 · 84 阅读 · 0 评论 -
【剑指 Offer 68 - II】二叉树的最近公共祖先
给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉树: root = [3,5,1,6,2,0,8,null,null,7,4]示例 1:输入: root = [3,5,1,6,2,0,8,null,null,7,4], p = 5, q = 1输出: 3解释: 节点 5 和节点 1原创 2020-08-27 14:20:11 · 120 阅读 · 0 评论 -
【剑指 Offer 68 - I】二叉搜索树的最近公共祖先
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5]示例 1:输入: root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8输出: 6 解释: 节点 2原创 2020-08-27 13:58:14 · 80 阅读 · 0 评论 -
剑指Offer题解汇总
序号名称备注剑指 Offer 03数组中重复的数字数组 哈希表剑指 Offer 04二维数组中的查找数组 线性查找剑指 Offer 05替换空格剑指 Offer 06从尾到头打印链表剑指 Offer 07重建二叉树剑指 Offer 09用两个栈实现队列剑指 Offer 10-I斐波那契数列剑指 Offer 10-II青蛙跳台阶问题剑指 Offer 11旋转数组的最小数字剑指 Offer 12矩阵...原创 2020-08-17 22:28:40 · 218 阅读 · 0 评论 -
【剑指 Offer 26】 树的子结构
输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构)B是A的子结构, 即 A中有出现和B相同的结构和节点值。例如:给定的树 A: 3 / \ 4 5 / \ 1 2给定的树 B: 4 / 1返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。示例 1:输入:A = [1,2,3], B = [3,1]输出:false示例 2:输入:A = [3,4,5,1,2], B = [4,1]输出:原创 2020-07-28 13:57:13 · 81 阅读 · 0 评论 -
【剑指 Offer 25】 合并两个排序的链表
输入两个递增排序的链表,合并这两个链表并使新链表中的节点仍然是递增排序的。示例1:输入:1->2->4, 1->3->4输出:1->1->2->3->4->4限制:0 <= 链表长度 <= 1000/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.next = null;原创 2020-07-28 13:55:33 · 84 阅读 · 0 评论 -
【剑指 Offer 24】 反转链表
定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点。示例:输入: 1->2->3->4->5->NULL输出: 5->4->3->2->1->NULL 限制:0 <= 节点个数 <= 5000/** * Definition for singly-linked list. * function ListNode(val) { * this.val = val; * this.n原创 2020-07-20 09:34:40 · 97 阅读 · 0 评论 -
【剑指 Offer 22】 链表中倒数第k个节点
输入一个链表,输出该链表中倒数第k个节点。为了符合大多数人的习惯,本题从1开始计数,即链表的尾节点是倒数第1个节点。例如,一个链表有6个节点,从头节点开始,它们的值依次是1、2、3、4、5、6。这个链表的倒数第3个节点是值为4的节点。示例:给定一个链表: 1->2->3->4->5, 和 k = 2.返回链表 4->5./** * Definition for singly-linked list. * function ListNode(val) { *原创 2020-07-20 09:33:26 · 93 阅读 · 0 评论 -
【剑指 Offer 21】 调整数组顺序使奇数位于偶数前面
输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。示例:输入:nums = [1,2,3,4]输出:[1,3,2,4] 注:[3,1,2,4] 也是正确的答案之一。提示:1 <= nums.length <= 500001 <= nums[i] <= 10000/** * @param {number[]} nums * @return {number[]} */var exchange =原创 2020-07-20 09:32:20 · 90 阅读 · 0 评论 -
【剑指 Offer 20】表示数值的字符串
请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100"、“5e2”、"-123"、“3.1416”、“0123"都表示数值,但"12e”、“1a3.14”、“1.2.3”、“±5”、"-1E-16"及"12e+5.4"都不是。/** * @param {string} s * @return {boolean} */var isNumber = function(s) { return !Number.isNaN(Number(s)) && s原创 2020-07-20 09:30:14 · 101 阅读 · 0 评论 -
【剑指 Offer 19】正则表达式匹配
请实现一个函数用来匹配包含’. ‘和’‘的正则表达式。模式中的字符’.‘表示任意一个字符,而’'表示它前面的字符可以出现任意次(含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"abaca"匹配,但与"aa.a"和"ab*a"均不匹配。示例 1:输入:s = "aa"p = "a"输出: false解释: "a" 无法匹配 "aa" 整个字符串。示例 2:输入:s = "aa"p = "a*"输出: true解释: 因为 '*' 代原创 2020-07-20 09:29:08 · 78 阅读 · 0 评论 -
【剑指 Offer 18】 删除链表的节点
给定单向链表的头指针和一个要删除的节点的值,定义一个函数删除该节点。返回删除后的链表的头节点。注意:此题对比原题有改动示例 1:输入: head = [4,5,1,9], val = 5输出: [4,1,9]解释: 给定你链表中值为 5 的第二个节点,那么在调用了你的函数之后,该链表应变为 4 -> 1 -> 9.示例 2:输入: head = [4,5,1,9], val = 1输出: [4,5,9]解释: 给定你链表中值为 1 的第三个节点,那么在调用了你的函数之后,该原创 2020-07-19 14:58:39 · 92 阅读 · 0 评论 -
【剑指 Offer 17】打印从1到最大的n位数
输入数字 n,按顺序打印出从 1 到最大的 n 位十进制数。比如输入 3,则打印出 1、2、3 一直到最大的 3 位数 999。示例 1:输入: n = 1输出: [1,2,3,4,5,6,7,8,9]说明:用返回一个整数列表来代替打印n 为正整数思路:/** * @param {number} n * @return {number[]} */var printNumbers = function(n) { let res = []; res.length = Math.原创 2020-07-19 14:54:59 · 78 阅读 · 0 评论 -
【剑指 Offer 16】 数值的整数次方
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。示例 1:输入: 2.00000, 10输出: 1024.00000示例 2:输入: 2.10000, 3输出: 9.26100示例 3:输入: 2.00000, -2输出: 0.25000解释: 2-2 = 1/22 = 1/4 = 0.25说明:-100.0 < x < 100.0n 是 32 位有符原创 2020-07-19 14:53:17 · 100 阅读 · 0 评论 -
【剑指 Offer 15】二进制中1的个数
请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。例如,把 9 表示成二进制是 1001,有 2 位是 1。因此,如果输入 9,则该函数输出 2。示例 1:输入:00000000000000000000000000001011输出:3解释:输入的二进制串 00000000000000000000000000001011 中,共有三位为 '1'。示例 2:输入:00000000000000000000000010000000输出:1解释:输入的二进制串 000000000000原创 2020-07-19 14:50:01 · 101 阅读 · 0 评论 -
【剑指 Offer 14- II】剪绳子 II
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m - 1] 。请问 k[0]k[1]…*k[m - 1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 =原创 2020-07-19 14:47:46 · 88 阅读 · 0 评论 -
【剑指 Offer 14- I】剪绳子
给你一根长度为 n 的绳子,请把绳子剪成整数长度的 m 段(m、n都是整数,n>1并且m>1),每段绳子的长度记为 k[0],k[1]…k[m-1] 。请问 k[0]k[1]…*k[m-1] 可能的最大乘积是多少?例如,当绳子的长度是8时,我们把它剪成长度分别为2、3、3的三段,此时得到的最大乘积是18。示例 1:输入: 2输出: 1解释: 2 = 1 + 1, 1 × 1 = 1示例 2:输入: 10输出: 36解释: 10 = 3 + 3 + 4, 3 × 3 × 4 =原创 2020-07-19 14:45:30 · 114 阅读 · 0 评论 -
【剑指 Offer 13】机器人的运动范围
地上有一个m行n列的方格,从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动,它每次可以向左、右、上、下移动一格(不能移动到方格外),也不能进入行坐标和列坐标的数位之和大于k的格子。例如,当k为18时,机器人能够进入方格 [35, 37] ,因为3+5+3+7=18。但它不能进入方格 [35, 38],因为3+5+3+8=19。请问该机器人能够到达多少个格子?示例 1:输入:m = 2, n = 3, k = 1输出:3示例 2:输入:m = 3,原创 2020-07-10 11:58:03 · 74 阅读 · 0 评论 -
【剑指 Offer 12】矩阵中的路径
请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一格开始,每一步可以在矩阵中向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。例如,在下面的3×4的矩阵中包含一条字符串“bfce”的路径(路径中的字母用加粗标出)。[[“a”,“b”,“c”,“e”],[“s”,“f”,“c”,“s”],[“a”,“d”,“e”,“e”]]但矩阵中不包含字符串“abfb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格原创 2020-07-10 10:47:42 · 97 阅读 · 0 评论 -
【剑指 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思路:1、递增数组,旋转了,那就只要遍历数组,找到nums[i]>nums[i+1],nums[i+1]就是最小的。function minArray(numbers: n原创 2020-07-09 14:52:07 · 79 阅读 · 0 评论 -
【剑指 Offer 10- II】青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21提示:0 <= n <= 100思路:和斐波那契数列已有的思路,递归function numWays(n: number): number { if(n===0) return 1; if原创 2020-07-09 09:30:26 · 92 阅读 · 0 评论 -
【剑指 Offer 10- I】斐波那契数列
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:1示例 2:输入:n = 5输出:5提示:0 <原创 2020-07-08 13:44:32 · 94 阅读 · 0 评论 -
【剑指 Offer 09】用两个栈实现队列
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )示例 1:输入:["CQueue","appendTail","deleteHead","deleteHead"][[],[3],[],[]]输出:[null,null,3,-1]示例 2:输入:["CQueue","deleteHead","appendTail","a原创 2020-07-08 13:25:42 · 99 阅读 · 0 评论 -
【剑指 Offer 07】重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树: 3 / \ 9 20 / \ 15 7限制:0 <= 节点个数 <= 5000思路:1、递归思想,前序遍历的第一个就是树的根节点,然后找中序遍历,原创 2020-07-07 10:43:48 · 797 阅读 · 0 评论 -
【剑指 Offer 06】从尾到头打印链表
输入一个链表的头节点,从尾到头反过来返回每个节点的值(用数组返回)。示例 1:输入:head = [1,3,2]输出:[2,3,1]限制:0 <= 链表长度 <= 10000思路:如果head!==null 就循环把每个值放到res里就可以了/** * Definition for singly-linked list. * class ListNode { * val: number * next: ListNode | null * con原创 2020-07-07 09:22:35 · 118 阅读 · 0 评论 -
【剑指 Offer 05】替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。示例 1:输入:s = "We are happy."输出:"We%20are%20happy."限制:0 <= s 的长度 <= 10000思路:1、直接循环s,遇到空格,就换成“%20”,需要一个新的变量来接2、用正则把空格替换掉function replaceSpace(s: string): string { return s.replace(/\s/g, '%20');};...原创 2020-07-07 09:12:26 · 117 阅读 · 0 评论 -
【剑指 Offer 04】二维数组中的查找
在一个 n * m 的二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。示例:现有矩阵 matrix 如下:[ [1, 4, 7, 11, 15], [2, 5, 8, 12, 19], [3, 6, 9, 16, 22], [10, 13, 14, 17, 24], [18, 21, 23, 26, 30]]给定 target = 5,返回 tr原创 2020-07-06 22:34:36 · 107 阅读 · 0 评论 -
【剑指 Offer 03】数组中重复的数字
找出数组中重复的数字。在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。示例 1:输入:[2, 3, 1, 0, 2, 5, 3]输出:2 或 3 限制:2 <= n <= 100000思路:一个简单的方法就是先排序,然后在排序数组中找就比较简单了。排序算法+从头扫描,这个算法的时间复杂度是O(nlogn)另一种方法是,创建一个hash表原创 2020-07-06 22:18:29 · 98 阅读 · 0 评论 -
【剑指 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 <= 数组长度 <= 10000思路:看到是递增数组且数字唯一,那就是有序数组,有序数组二分法来找nums[i]!==i的值就可以const missingNumber = (nums: n原创 2020-07-06 09:29:07 · 117 阅读 · 0 评论 -
【剑指 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限制:1 <= n <= 10000思路:不能用乘除法和循环以及条件语句,那就只能递归了递归的思路就是如果输入的值>0就继续加const sumNums = function(n: number): number { return n &am原创 2020-07-06 09:24:30 · 103 阅读 · 0 评论