剑指Offer题解
多么温暖的阳光啊
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
【剑指 Offer 题解】40. 最小的 K 个数
题目输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。思路快速排序的 partition() 方法,会返回一个整数 j 使得 a[l…j-1] 小于等于 a[j],且 a[j+1…h] 大于等于 a[j],此时 a[j] 就是数组的第 j 大元素。可以利用这个特性找出数组的第 K 个元素,这种找第 K 个元素的算法称为...原创 2020-03-05 15:21:22 · 203 阅读 · 0 评论 -
【剑指 Offer 题解】42. 连续子数组的最大和
题目{6, -3, -2, 7, -15, 1, 2, 2},连续子数组的最大和为 8(从第 0 个开始,到第 3 个为止)。思路dp[i] 表示以i结尾的连续子数组的最大和(连续子数组的结尾是i)dp[i] = dp[i - 1] + array[i],dp[i - 1] > 0dp[i] = array[i],dp[i] <= 0max存储在遍历过程中出现过的最大和...原创 2020-03-02 19:47:37 · 154 阅读 · 0 评论 -
【剑指 Offer 题解】43. 从 1 到 n 整数中 1 出现的次数
题目求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。思路分别计算个位、十位、百位…上出现 1 的个数public int ...原创 2020-03-02 19:21:32 · 103 阅读 · 0 评论 -
【剑指 Offer 题解】44. 数字序列中的某一位数字
题目数字以 0123456789101112131415… 的格式序列化到一个字符串中,求这个字符串的第 index 位。思路一个数字一个数字遍历,记录当前数字在字符串的下标。public int getDigitAtIndex(int index) { if(index < 0) { return -1; } int curIndex = 0; int curNum...原创 2020-03-02 19:17:30 · 129 阅读 · 0 评论 -
【剑指 Offer 题解】45. 把数组排成最小的数
题目输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组 {3,32,321},则打印出这三个数字能排成的最小数字为 321323。思路可以看成是一个排序问题,在比较两个字符串 S1 和 S2 的大小时,应该比较的是 S1+S2 和 S2+S1 的大小,如果 S1+S2 < S2+S1,那么应该把 S1 排在前面,否则应该把 S2 排...原创 2020-03-02 17:39:10 · 176 阅读 · 0 评论 -
【剑指 Offer 题解】46. 把数字翻译成字符串
题目给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路dp[i] 表示从第i个数字开始,翻译方法的个数如果第i位和i+1位拼起来的数字大于25,第i位只能单独成一个字母, dp[i] ...原创 2020-03-02 14:55:15 · 208 阅读 · 0 评论 -
【剑指 Offer 题解】47. 礼物的最大价值
题目在一个 m*n 的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于 0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘示例Input:1 10 3 812 2 9 65 7 4 113 7 16 5Output:53礼物的最大价值...原创 2020-03-02 12:42:23 · 110 阅读 · 0 评论 -
【剑指 Offer 题解】48. 最长不含重复字符的子字符串
题目输入一个字符串(只包含 a~z 的字符),求其最长不含重复字符的子字符串的长度。例如对于 arabcacfr,最长不含重复字符的子字符串为 acfr,长度为 4。思路方法1动态规划,dp[i] 表示 以第i个字符结尾的串,最长不含重复字符的子串长度。第i个字符未出现过,dp[i] = dp[i - 1] + 1,第i个字符出现过,该字符与上次出现的位置距离为d:如果d <...原创 2020-02-25 16:52:07 · 172 阅读 · 0 评论 -
【剑指 Offer 题解】49. 丑数
题目把只包含因子 2、3 和 5 的数称作丑数(Ugly Number)。例如 6、8 都是丑数,但 14 不是,因为它包含因子 7。习惯上我们把 1 当做是第一个丑数。求按从小到大的顺序的第 N 个丑数。思路一个丑数 * 2/3/5 一定还是个丑数public int GetUglyNumber_Solution(int index) { if (index <= 6)...原创 2020-02-24 19:33:48 · 92 阅读 · 0 评论 -
【剑指 Offer 题解】50. 第一个只出现一次的字符位置
题目在一个字符串中找到第一个只出现一次的字符,并返回它的位置。示例Input:abaacOutput:1思路方法1使用HashMap 保存每个字符出现的次数,然后返回值出现一次的字符下标。public int FirstNotRepeatingChar(String str) { if (str == null || str.length() == 0) retur...原创 2020-02-24 18:52:17 · 142 阅读 · 0 评论 -
【剑指 Offer 题解】51. 数组中的逆序对
题目在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数P。并将P对1000000007取模的结果输出。 即输出P%1000000007示例Input:1,2,3,4,5,6,7,0Output:7思路...原创 2020-02-24 18:51:56 · 100 阅读 · 0 评论 -
【剑指 Offer 题解】52. 两个链表的第一个公共结点
题目输入两个链表,找出它们的第一个公共结点。(注意因为传入数据是链表,所以错误测试数据的提示是用其他方式显示的,保证传入数据是正确的)思路方法1两个链表公共节点后的所有节点都相同,链表长度也相同。图中,B链表的长度比A链表的长度长1,可以先让B链表的指针向前移动1个,然后两个链表指针同时向前,当前节点是否为公共节点。1、先求出两链表长度之差 diff2、较长的链表向前走 diff...原创 2020-02-24 12:49:13 · 137 阅读 · 0 评论 -
【剑指 Offer 题解】53. 数字在排序数组中出现的次数
题目统计一个数字在排序数组中出现的次数。示例Input:nums = 1, 2, 3, 3, 3, 3, 4, 6K = 3Output:4思路1、直接循环,统计次数public int GetNumberOfK(int [] array , int k) { int count = 0; for (int num : array) { if (num =...原创 2020-02-24 11:49:29 · 85 阅读 · 0 评论 -
【剑指 Offer 题解】54. 二叉查找树的第 K 个结点
题目给定一棵二叉搜索树,请找出其中的第k小的结点。例如,(5,3,7,2,4,6,8)中,按结点数值大小顺序第三小结点的值为4。思路二叉搜索树的中序遍历结果为数值的递增排序。中序遍历:左子树的中序遍历 --> 访问根节点 --> 右子树的中序遍历private int curIndex = 0;private TreeNode result;private boole...原创 2020-02-21 20:25:52 · 163 阅读 · 0 评论 -
【剑指 Offer 题解】55.2 平衡二叉树
题目输入一棵二叉树,判断该二叉树是否是平衡二叉树。思路一棵二叉树是否为平衡二叉树 = Math.abs(左子树的深度 - 右子树的深度) <= 1public boolean IsBalanced_Solution(TreeNode root) { if (root == null) return true; int leftDepth = dep...原创 2020-02-21 19:22:32 · 161 阅读 · 0 评论 -
【剑指 Offer 题解】55.1 二叉树的深度
题目输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。思路树的深度 = 1 + max(左树的深度, 右树的深度)终止条件,树的根节点为null,深度为0/**public class TreeNode { int val = 0; TreeNode left = null; TreeNo...原创 2020-02-21 19:00:10 · 156 阅读 · 0 评论 -
【剑指 Offer 题解】56. 数组中只出现一次的数字
题目一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。思考原创 2020-02-21 16:56:36 · 119 阅读 · 0 评论 -
【剑指 Offer 题解】57.2 和为 S 的连续正数序列
题目找出所有和为S的连续正数序列示例Input:100Output:[9, 10, 11, 12, 13, 14, 15, 16][18, 19, 20, 21, 22]思路public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<A...原创 2020-02-20 20:13:11 · 149 阅读 · 0 评论 -
【剑指 Offer 题解】57.1 和为 S 的两个数字
题目输入一个递增排序的数组和一个数字 S,在数组中查找两个数,使得他们的和正好是 S。如果有多对数字的和等于 S,输出两个数的乘积最小的。思路使用双指针,一个指针指向元素较小的值,一个指针指向元素较大的值。指向较小元素的指针从头向尾遍历,指向较大元素的指针从尾向头遍历。public ArrayList<Integer> FindNumbersWithSum(int [] arr...原创 2020-02-20 19:59:25 · 191 阅读 · 0 评论 -
【剑指 Offer 题解】58.2 左旋转字符串
题目汇编语言中有一种移位指令叫做循环左移(ROL),现在有个简单的任务,就是用字符串模拟这个指令的运算结果。对于一个给定的字符序列S,请你把其循环左移K位后的序列输出。例如,字符序列S=”abcXYZdef”,要求输出循环左移3位后的结果,即“XYZdefabc”。是不是很简单?OK,搞定它!示例Input:S="abcXYZdef"K=3Output:"XYZdefabc"思...原创 2020-02-20 19:48:01 · 1414 阅读 · 0 评论 -
【剑指 Offer 题解】58.1 翻转单词顺序列
题目牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上。同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思。例如,“student. a am I”。后来才意识到,这家伙原来把句子单词的顺序翻转了,正确的句子应该是“I am a student.”。Cat对一一的翻转这些单词顺序可不在行,你能帮助他么?思路1、直接解决,每个单词...原创 2020-02-14 19:48:42 · 224 阅读 · 0 评论 -
【剑指 Offer 题解】59. 滑动窗口的最大值
题目描述给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。示例数组:[2,3,4,2,6,2,5,1]滑动窗口大小:3那么,一共存在6个滑动窗口,他们的最大值分别为[4,4,6,6,6,5]思路1、暴力解决public ArrayList<Integer> maxInWindows(int[] num, int size) { ArrayList<...原创 2020-02-13 18:46:02 · 122 阅读 · 0 评论 -
【剑指 Offer 题解】60. n 个骰子的点数
题目描述把n个骰子仍在地上,所有的骰子朝上的一面的点数之和为s,输入n,打印出s所有可能的值出现的概率。示例一个骰子的情况Input: n = 1Output: [[1, 0.17], [2, 0.17], [3, 0.17], [4, 0.17], [5, 0.17], [6, 0.17]]两个骰子的情况Input: n = 2Output: [[2,0.03],[3,0.06...原创 2020-02-13 18:00:49 · 201 阅读 · 0 评论 -
【剑指 Offer 题解】61. 扑克牌顺子
题目描述从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王可以看成任意数字,大、小王记为0。思路1、若没有大小王,对数组进行排序,判断是否为顺子。2、若有大小王,对数组进行排序,根据大小王的个数,判断是否为顺子。public boolean isContinuous(int nums[]) { if ...原创 2020-02-13 12:58:29 · 172 阅读 · 0 评论 -
【剑指 Offer 题解】62. 圆圈中最后剩下的数
题目描述让小朋友们围成一个大圈。然后,随机指定一个数 m,让编号为 0 的小朋友开始报数。每次喊到 m-1 的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续 0…m-1 报数 … 这样下去 … 直到剩下最后一个小朋友,获得最终超级大奖,请问谁是这位幸运的小朋友呢。思路1、直接循环public int lastRemining(int...原创 2020-02-12 12:37:23 · 168 阅读 · 0 评论 -
【剑指 Offer 题解】63. 股票的最大利润
题目描述假设把某股票的价格按照时间先后顺序存储在数组中,请问买卖交易该股票可能获得的利润是多少?例如一只股票在某些时间xxxx的价格为{9, 11, 8, 5,7, 12, 16, 14}。如果我们能在价格为5的时候买入并在价格为16时卖出,则能收获最大的利润11。思路...原创 2020-02-11 18:48:06 · 221 阅读 · 0 评论 -
【剑指 Offer 题解】64. 求 1+2+3+...+n
题目描述要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句 A ? B : C。思路1、不能使用for while 循环,咱们可以使用递归啊。2、递归终止需要进行终止条件判断,但本题中不能使用 if 判断,也不能使用三元表达式。3、条件与&& 具有短路原则,即第一个条件不成立,第二个条件不会执行。利用这一特性,可以将递归...原创 2020-02-10 14:41:13 · 176 阅读 · 0 评论 -
【剑指 Offer 题解】65. 不用加减乘除做加法
题目描述写一个函数,求两个整数之和,要求不得使用 +、-、*、/ 四则运算符号。思路1、两个数异或,表示没有考虑进位的情况下两数的和2、两个数相与,并左移一位,表示进位3、上述两步结果相加计算 3 + 61、两数异或 0011 ^ 0110 = 0101 2、两数相与 0011 & 0110 = 00103、左移一位 0010 << 1 = 0100即 00...原创 2020-02-10 14:15:11 · 115 阅读 · 0 评论 -
【剑指 Offer 题解】67. 把字符串转换成整数
题目描述将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。输入输出示例Iuput:+21474836471a33Output:21474836470思路public int strToInt(String str) { if (str == null || "".equals(str)) { return ...原创 2020-02-10 13:25:42 · 191 阅读 · 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、若使用可以使用除法,B[i] = 总乘积 / A[i]2、若暴力解决,连乘后时间复杂度为 O(N^2) ,效率过低3、B[i] = A[i] 左边连乘 × A[i]右边连乘...原创 2020-02-09 16:21:21 · 124 阅读 · 0 评论
分享