
剑指offer
一只小白的奋斗历程
学如逆水行舟,不进则退。
扎根,做好手头的事,精进。
展开
-
【Java语言】力扣系列----剑指 Offer 67. 把字符串转换成整数
写一个函数 StrToInt,实现把字符串转换成整数这个功能。不能使用 atoi 或者其他类似的库函数。首先,该函数会根据需要丢弃无用的开头空格字符,直到寻找到第一个非空格的字符为止。当我们寻找到的第一个非空字符为正或者负号时,则将该符号与之后面尽可能多的连续数字组合起来,作为该整数的正负号;假如第一个非空字符是数字,则直接将其与之后连续的数字字符组合起来,形成整数。该字符串除了有效的整数部分之后也可能会存在多余的字符,这些字符可以被忽略,它们对于函数不应该造成影响。注意:假如该字符串中的第一个非空原创 2020-08-30 17:18:28 · 138 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。示例 1:输入: [10,2]输出: “102”示例 2:输入: [3,30,34,5,9]输出: “3033459”提示:0 < nums.length <= 100说明:输出结果可能非常大,所以你需要返回一个字符串而不是整数拼接起来的数字可能会有前导 0,最后结果不需要去掉前导 0具体代码实现如下:class Solution { public String min原创 2020-08-04 16:23:04 · 202 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 43. 1~n整数中1出现的次数
输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。示例 1:输入:n = 12输出:5示例 2:输入:n = 13输出:6限制:1 <= n < 2^31具体代码实现如下:class Solution { public int countDigitOne(int n) { // 找规律 int digit = 1, res =原创 2020-08-04 15:50:30 · 159 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 29. 顺时针打印矩阵
输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。示例 1:输入:matrix = [[1,2,3],[4,5,6],[7,8,9]]输出:[1,2,3,6,9,8,7,4,5]示例 2:输入:matrix = [[1,2,3,4],[5,6,7,8],[9,10,11,12]]输出:[1,2,3,4,8,12,11,10,9,5,6,7]限制:0 <= matrix.length <= 1000 <= matrix[i].length <= 100具原创 2020-08-03 15:50:41 · 184 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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-30 19:35:49 · 192 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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-30 18:06:35 · 178 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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, n原创 2020-07-30 16:59:23 · 153 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 10- II. 青蛙跳台阶问题
一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。示例 1:输入:n = 2输出:2示例 2:输入:n = 7输出:21提示:0 <= n <= 100具体代码实现如下:class Solution { public int numWays(int n) { if(n < 2) re原创 2020-07-30 15:20:49 · 169 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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]] 限制:1 <= target <= 10^5具体代码实现如下:class Solution { public int[][]原创 2020-07-30 09:22:59 · 157 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 62. 圆圈中最后剩下的数字
0,1,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0、1、2、3、4这5个数字组成一个圆圈,从数字0开始每次删除第3个数字,则删除的前4个数字依次是2、0、4、1,因此最后剩下的数字是3。示例 1:输入: n = 5, m = 3输出: 3示例 2:输入: n = 10, m = 17输出: 2 限制:1 <= n <= 10^51 <= m <= 10^6具体代码实现如下:原创 2020-07-29 21:25:18 · 158 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 61. 扑克牌中的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。示例 1:输入: [1,2,3,4,5]输出: True 示例 2:输入: [0,0,1,2,5]输出: True 限制:数组长度为 5 数组的数取值为 [0, 13] .具体代码实现如下:class Solution { public boolean isStraight(i原创 2020-07-29 20:10:14 · 220 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 59 - II. 队列的最大值
请定义一个队列并实现函数 max_value 得到队列里的最大值,要求函数max_value、push_back 和 pop_front 的均摊时间复杂度都是O(1)。若队列为空,pop_front 和 max_value 需要返回 -1示例 1:输入: ["MaxQueue","push_back","push_back","max_value","pop_front","max_value"][[],[1],[2],[],[],[]]输出: [null,null,null,2,1,2]示原创 2020-07-29 16:21:45 · 161 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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 3 1 [3 -1 -3] 5 3 6 7 3 1 3 [-1 -3原创 2020-07-29 10:00:43 · 236 阅读 · 1 评论 -
【Java语言】力扣系列----剑指 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具体代码实现如下:class Solution { public int[] constructArr(int[]原创 2020-07-25 09:54:56 · 137 阅读 · 0 评论 -
【Java语言】力扣系列----面试题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-07-24 22:21:43 · 131 阅读 · 0 评论 -
【Java语言】力扣系列----面试题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-07-24 16:06:50 · 146 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 65. 不用加减乘除做加法
写一个函数,求两个整数之和,要求在函数体内不得使用 “+”、“-”、“*”、“/” 四则运算符号。示例:输入: a = 1, b = 1输出: 2 提示:a, b 均可能是负数或 0结果不会溢出 32 位整数具体代码实现如下:class Solution { public int add(int a, int b) { /* 利用二进制的位运算来解答。先将a,b看成二进制数。 负数的补码等于它的反码加1(符号位原创 2020-07-24 10:44:54 · 181 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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具体代码实现如下:class Solution { int res = 0; public int sumNums(int n) { boolean x = n > 1 &a原创 2020-07-24 09:29:15 · 180 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 58 - I. 翻转单词顺序
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"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-07-20 20:40:31 · 186 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。示例 1:输入: s = "abcdefg", k = 2输出: "cdefgab"示例 2:输入: s = "lrloseumgh", k = 6输出: "umghlrlose" 限制:1 <= k < s.length <= 10000具体代码实现如下:c原创 2020-07-20 15:53:18 · 164 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 57. 和为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] 限制:1 <= nums.length <= 10^51 <= nums[i] <= 1原创 2020-07-19 23:28:02 · 102 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 56 - II. 数组中数字出现的次数 II
在一个数组 nums 中除一个数字只出现一次之外,其他数字都出现了三次。请找出那个只出现一次的数字。示例 1:输入:nums = [3,4,3,3]输出:4示例 2:输入:nums = [9,1,7,9,7,9,7]输出:1 限制:1 <= nums.length <= 100001 <= nums[i] < 2^31具体代码实现如下:class Solution { public int singleNumber(int[] nums)原创 2020-07-19 23:15:21 · 215 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 56 - I. 数组中数字出现的次数
一个整型数组 nums 里除两个数字之外,其他数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。示例 1:输入:nums = [4,1,4,6]输出:[1,6] 或 [6,1]示例 2:输入:nums = [1,2,10,4,1,4,3,3]输出:[2,10] 或 [10,2] 限制:2 <= nums.length <= 10000具体代码实现如下:class Solution { public in原创 2020-07-19 23:00:19 · 127 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 55 - I. 二叉树的深度
输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点依次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。例如:给定二叉树 [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回它的最大深度 3 。 提示:节点总数 <= 10000具体代码实现如下:/** * Definition for a binary tree node. * public class TreeNo原创 2020-07-19 22:15:10 · 158 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 54. 二叉搜索树的第k大节点
给定一棵二叉搜索树,请找出其中第k大的节点。示例 1:输入: root = [3,1,4,null,2], k = 1 3 / \ 1 4 \ 2输出: 4示例 2:输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / \ 3 6 / \ 2 4 / 1输出: 4 限制:1 ≤ k ≤ 二叉搜索树元素个数具体代码实现如下:/** * Defin原创 2020-07-19 19:58:35 · 186 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 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具体代码实现如下:class Solution { public int missingNumber(int[] nums) { // 创建原创 2020-07-19 19:32:21 · 150 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 53 - I. 在排序数组中查找数字 I
统计一个数字在排序数组中出现的次数。示例 1:输入: nums = [5,7,7,8,8,10], target = 8输出: 2示例 2:输入: nums = [5,7,7,8,8,10], target = 6输出: 0限制:0 <= 数组长度 <= 50000具体代码实现如下:class Solution { public int search(int[] nums, int target) { // 特例判断 if原创 2020-07-19 19:01:31 · 175 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 52. 两个链表的第一个公共节点
输入两个链表,找出它们的第一个公共节点。`具体代码实现如下:/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { * val = x; * next = null; * } * } */public class Solution { pu原创 2020-07-19 17:42:09 · 123 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 50. 第一个只出现一次的字符
在字符串 s 中找出第一个只出现一次的字符。如果没有,返回一个单空格。 s 只包含小写字母。示例:s = "abaccdeff"返回 "b"s = "" 返回 " " 限制:0 <= s 的长度 <= 50000具体代码实现如下:class Solution { public char firstUniqChar(String s) { // 如果字符串为空,则返回单空格 if(s.length() == 0) return原创 2020-07-19 10:00:17 · 142 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 42. 连续子数组的最大和
输入一个整型数组,数组里有正数也有负数。数组中的一个或连续多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。示例1:输入: nums = [-2,1,-3,4,-1,2,1,-5,4]输出: 6解释: 连续子数组 [4,-1,2,1] 的和最大,为 6。 提示:1 <= arr.length <= 10^5-100 <= arr[i] <= 100具体代码实现如下:class Solution { public int原创 2020-07-19 00:01:04 · 127 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 36. 二叉搜索树与双向链表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。具体代码实现如下:/*// Definition for a Node.class Node { public int val; public Node left; public Node right; public Node() {} public Node(int _val) { val = _val; }原创 2020-07-18 11:03:17 · 151 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 40. 最小的k个数
输入整数数组 arr ,找出其中最小的 k 个数。例如,输入4、5、1、6、2、7、3、8这8个数字,则最小的4个数字是1、2、3、4。示例 1:输入:arr = [3,2,1], k = 2输出:[1,2] 或者 [2,1]示例 2:输入:arr = [0,1,2,1], k = 1输出:[0] 限制:0 <= k <= arr.length <= 100000 <= arr[i] <= 10000具体代码实现如下:class Soluti原创 2020-07-18 10:15:17 · 169 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 39. 数组中出现次数超过一半的数字
数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。你可以假设数组是非空的,并且给定的数组总是存在多数元素。示例 1:输入: [1, 2, 3, 2, 2, 2, 5, 4, 2]输出: 2限制:1 <= 数组长度 <= 50000具体代码实现如下:class Solution { public int majorityElement(int[] nums) { int res = nums[0];// 命令第一个数上战场 in原创 2020-07-17 23:51:07 · 137 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 34. 二叉树中和为某一值的路径
输入一棵二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶节点所经过的节点形成一条路径。示例:给定如下二叉树,以及目标和 sum = 22, 5 / \ 4 8 / / \ 11 13 4 / \ / \ 7 2 5 1返回:[ [5,4,11,2], [5,原创 2020-07-17 11:14:55 · 119 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 31. 栈的压入、弹出序列
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如,序列 {1,2,3,4,5} 是某栈的压栈序列,序列 {4,5,3,2,1} 是该压栈序列对应的一个弹出序列,但 {4,3,5,1,2} 就不可能是该压栈序列的弹出序列。示例 1:输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]输出:true解释:我们可以按以下顺序执行:push(1), push(2), push(3), push(4原创 2020-07-17 09:52:45 · 143 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 30. 包含min函数的栈
定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的 min 函数在该栈中,调用 min、push 及 pop 的时间复杂度都是 O(1)。示例:MinStack minStack = new MinStack();minStack.push(-2);minStack.push(0);minStack.push(-3);minStack.min(); --> 返回 -3.minStack.pop();minStack.top(); --> 返回 0.mi原创 2020-07-16 23:48:23 · 191 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 32 - III. 从上到下打印二叉树 III
请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,第三行再按照从左到右的顺序打印,其他行以此类推。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [20,9], [15,7]] 提示:节点总数 <= 1000具体代码实现如下:/** * Definition for a bi原创 2020-07-14 15:44:20 · 124 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 32 - II. 从上到下打印二叉树 II
从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回其层次遍历结果:[ [3], [9,20], [15,7]] 提示:节点总数 <= 1000具体代码实现如下:/** * Definition for a binary tree node. * public class TreeN原创 2020-07-14 11:12:33 · 210 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 32 - I. 从上到下打印二叉树
从上到下打印出二叉树的每个节点,同一层的节点按照从左到右的顺序打印。例如:给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7返回:[3,9,20,15,7] 提示:节点总数 <= 1000具体代码实现如下:/** * Definition for a binary tree node. * public class TreeNode { * int val; *原创 2020-07-14 10:24:10 · 194 阅读 · 0 评论 -
【Java语言】力扣系列----剑指 Offer 28. 对称的二叉树
请实现一个函数,用来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。 1 / \ 2 2 / \ / \3 4 4 3但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1 / \ 2 2 \ \ 3 3 示例 1:输入:root = [1,2,2,3,4,4,3]输出:true示例 2:输入:roo原创 2020-07-12 16:24:29 · 134 阅读 · 0 评论