![](https://img-blog.csdnimg.cn/20201014180756918.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指 Offer
枳洛淮南✘
没有人生来就是弱者
展开
-
剑指 Offer 57 - II. 和为s的连续正数序列
剑指 Offer 57 - II. 和为s的连续正数序列链接代码枚举枚举+数学优化双指针链接剑指 Offer 57 - II. 和为s的连续正数序列代码枚举枚举每个正整数为起点,判断以它为起点的序列和 sum 是否等于 target 即可,由于题目要求序列长度至少大于 2,所以枚举的上界为public int[][] findContinuousSequence1(int target) { //让每个整数都做为起点尝试 List<int[]&g原创 2021-07-11 15:47:18 · 89 阅读 · 0 评论 -
剑指 Offer 63. 股票的最大利润
剑指 Offer 63. 股票的最大利润链接代码暴力破解法寻找最低点链接剑指 Offer 63. 股票的最大利润代码暴力破解法除了慢一点也没啥//双循环暴力法 public int maxProfit(int[] prices) { int ret = 0; for (int i = 0; i < prices.length - 1; i++) { for (int j = i + 1; j <原创 2021-07-08 11:48:53 · 91 阅读 · 0 评论 -
剑指 Offer 64. 求1+2+…+n
剑指 Offer 64. 求1+2+…+n链接解法链接剑指 Offer 64. 求1+2+…+n解法C++解法class Solution {public: int sumNums(int n) { int temp = n; temp && (temp += (sumNums(n-1))); return temp; }};Javapublic int sumNums(int n) {原创 2021-07-08 11:23:26 · 74 阅读 · 0 评论 -
剑指 Offer 49. 丑数
剑指 Offer 49. 丑数链接思路代码链接剑指 Offer 49. 丑数思路第一个丑数是1,以后的丑数都是基于前面的丑数进行计算获得,分别乘2,3,5构成。我们每次添加进去一个当前计算出来个三个丑数的最小的一个,并且是谁计算的,谁指针就后移一位。代码class Solution { //第一个丑数是1,以后的丑数都是基于前面的丑数进行计算获得 // 分别乘2,3,5构成的。我们每次添加进去一个当前计算出来个 // 三个丑数的最小的一个,并且是谁计算的,谁指针就后移一原创 2021-07-07 14:51:31 · 83 阅读 · 0 评论 -
剑指 Offer 58 - II. 左旋转字符串
剑指 Offer 58 - II. 左旋转字符串链接题解代码链接剑指 Offer 58 - II. 左旋转字符串题解首先判断字符串是否为空字符串,若为空字符串则无论怎样旋转返回值都是空字符串然后在确保字符串不为空的情况下,判断要旋转的字符个数,将大于字符串长度的数进行取模,最后达到的旋转字符数必然小于字符串长度之后用substring函数解决问题即可代码class Solution { public String reverseLeftWords(String s, int n)原创 2021-06-29 00:57:50 · 82 阅读 · 0 评论 -
剑指 Offer 61. 扑克牌中的顺子
剑指 Offer 61. 扑克牌中的顺子链接题解代码链接剑指 Offer 61. 扑克牌中的顺子题解首先将数组进行排序,然后遍历数组,记录数组中万能牌(0)的数量,遍历完万能牌后,遍历非万能牌,若某一非万能牌的下一张牌与其相等,则该数组必然不为顺子,后续如果牌不连续,则记录空缺位置,直到遍历完数组,然后比较万能牌是否大于等于空缺位的数量,大于等于则为顺子,反之则不为顺子。代码public boolean isStraight(int[] nums) { //首先将数组排序原创 2021-06-29 00:36:42 · 83 阅读 · 0 评论 -
剑指 Offer 41. 数据流中的中位数
剑指 Offer 41. 数据流中的中位数链接思路代码链接剑指 Offer 41. 数据流中的中位数思路用大顶堆+小顶堆方法,可以看作大顶堆是普通班,小顶堆是实验班。数量上时刻保持 小顶-大顶<=1(两堆相等或者小顶比大顶多一个)。新学生先入普通班(大顶堆),此时可能会失去平衡了,于是取大顶堆的第一个(班里最好的学生)加入实验班(小顶堆),判断若数量过多(不是等于或多一个),取第一个(实验班里最差的学生)到普通班(大顶堆)里。取中位数的时候,若两堆数量相等,则各取堆顶取平均,若小顶比大顶多一,原创 2021-06-19 20:46:34 · 70 阅读 · 0 评论 -
剑指 Offer 46. 把数字翻译成字符串
剑指 Offer 46. 把数字翻译成字符串链接题解链接添加链接描述题解class Solution { public int translateNum(int num) { if (num <= 9) { return 1; } //获取输入数字的余数(后两位),递归翻译 int temp = num % 100; //小于等于9 或 大于等于 26 ,余数原创 2021-06-19 15:25:54 · 87 阅读 · 0 评论 -
剑指 Offer题解
剑指 Offer题解04.二维数组中的查找05.替换空格06. 从尾到头打印链表07. 重建二叉树09. 用两个栈实现队列10. I. 斐波那契数列10. II. 青蛙跳台阶问题11. 旋转数组的最小数字14- I. 剪绳子14- II. 剪绳子 II15. 二进制中1的个数16. 数值的整数次方17. 打印从1到最大的n位数18. 删除链表的节点21. 调整数组顺序使奇数位于偶数前面22.链表中倒数第k个节点24. 反转链表25. 合并两个排序的链表29. 顺时针打印矩阵30. 包含min函数的栈31.原创 2021-06-01 11:48:22 · 444 阅读 · 21 评论 -
剑指 Offer 22. 链表中倒数第k个节点
题目描述输入一个链表,输出该链表中倒数第k个结点。示例1输入1,{1,2,3,4,5}返回值{5}双指针让前指针先走k步,后指针走总结点数-k步,即后指针找到倒数第k个节点/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public.原创 2021-02-02 14:17:18 · 239 阅读 · 3 评论 -
剑指 Offer 04. 二维数组中的查找
剑指 Offer 04. 二维数组中的查找思路1、直接遍历2、从右上角遍历代码1、直接遍历2、从右上角遍历思路1、直接遍历直接遍历即可,也没啥思路2、从右上角遍历思路已经在代码里代码1、直接遍历class Solution { public boolean findNumberIn2DArray(int[][] matrix, int target) { for (int i = 0; i < matrix.length; i++) {原创 2021-04-10 20:12:40 · 70 阅读 · 0 评论 -
剑指 Offer 05. 替换空格
剑指 Offer 05. 替换空格思路1、遍历2、库函数代码1、遍历2、库函数思路1、遍历将字符串转换为字符数组,进行遍历,用一个StringBuilder对象来接收,若为空格则追加“%20”,否则追加本身字符,然后返回 StringBuilder.toString()2、库函数调用 String 对象的 replaceAll 方法或 replace 方法来直接进行替换代码1、遍历class Solution { public String replaceSpace(String原创 2021-04-10 20:25:34 · 59 阅读 · 0 评论 -
剑指 Offer 06. 从尾到头打印链表
剑指 Offer 06. 从尾到头打印链表思路先求链表长度,再用数组添加代码先求链表长度,再用数组添加思路先求链表长度,再用数组添加先求出链表长度,作为数组长度,然后遍历链表并将数值逆序加入到链表中代码先求链表长度,再用数组添加/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val原创 2021-04-10 21:02:48 · 66 阅读 · 0 评论 -
剑指 Offer 07. 重建二叉树
剑指 Offer 07. 重建二叉树思路代码思路用递归来连接代码/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode(int x) { val = x; } * } */class Solution { //将指定数组的指定范围复制到新数组中原创 2021-04-10 21:29:03 · 66 阅读 · 0 评论 -
剑指 Offer 09. 用两个栈实现队列
剑指 Offer 09. 用两个栈实现队列思路代码思路用两个栈,一个作为输入栈,一个作为输出栈,进行操作a 为空,b 为空,则返回 -1若b 为空,a 不为空,则将a 中的元素压入 b中,让其进行头删操作代码import java.util.Stack;/** * @author 枳洛淮南 * @version 1.0 * @Description 功能 * @Date 2021/4/10 下午 21:34 */class CQueue{ private Sta原创 2021-04-11 09:46:00 · 67 阅读 · 2 评论 -
剑指 Offer 10- I. 斐波那契数列
剑指 Offer 10- I. 斐波那契数列思路代码思路经典迭代永不过时,但题目要求在数据过大时采用取模1e+7 的思路来保证结果不会溢出,会有一些耗时,所以我们可以在循环迭代的过程中对大于1e+7返回值进行 -=1e+7 操作来减少耗时,具体可看代码代码class Solution { public int fib(int n) { if (n == 0 || n == 1) { return n; }原创 2021-04-11 10:06:40 · 98 阅读 · 0 评论 -
剑指 Offer 10- II. 青蛙跳台阶问题
剑指 Offer 10- II. 青蛙跳台阶问题思路代码思路还是一样的经典迭代,用递归很容易超时题目要求 当 n == 0,时,青蛙可来个托马斯回旋,然后返回1当 n == 1,时,青蛙有一种方法当 n == 2,时,青蛙有两种方法当 n == 3,时,青蛙有三种方法当 n == 4,时,青蛙有四种方法…熟悉的朋友应该已经看出了这与斐波那契数列有着相似之处代码如下,不过熟悉的取模 1000000007,我依旧是用了大于则减去方法,没有选择取模为什么要模1000000007(跟我念,一,原创 2021-04-11 10:29:30 · 146 阅读 · 0 评论 -
剑指 Offer 11. 旋转数组的最小数字
剑指 Offer 11. 旋转数组的最小数字链接思路1、暴力排序2、遍历代码1、暴力排序2、遍历链接剑指 Offer 11. 旋转数组的最小数字思路1、暴力排序先将数组排序,然后输出第一个元素即最小数2、遍历遍历题目给的数组,由于提示规定数组是将一个递增的数组旋转所得,则在遍历途中将最小值设置为数组的第一个元素,若遍历过程中遇到比最小值小的数,则说明这个数后的数都比其大,即该数为最小值同时最小值不用进行更新,更新反而导致错误1、最小值为第一个数,若该数为最小值,则遍历完成后返回该数2、若原创 2021-04-11 14:16:39 · 56 阅读 · 0 评论 -
剑指 Offer 14- I. 剪绳子
剑指 Offer 14- I. 剪绳子链接思路每次减去3代码链接剑指 Offer 14- I. 剪绳子思路每次减去3绳子段切分的越多,乘积越大,且3做因数比2更优。不断剪去 长度3 并用sum累乘把绳子切为多个长度为 3 的片段,则留下的最后一段绳子的长度可能为 0,1,2 三种情况。循环结束的三种情况:n=n-3-->2n长度剩下2,因 n > 4 跳出循环,return 乘积为sum*2。n=n-3-->3长度刚好可以被剪完,因 n > 4 跳出循环,re原创 2021-04-11 14:43:05 · 73 阅读 · 0 评论 -
剑指 Offer 14- II. 剪绳子 II
剑指 Offer 14- II. 剪绳子 II链接思路代码链接剑指 Offer 14- II. 剪绳子 II剑指 Offer 14- I. 剪绳子思路与剪绳子I相似,不同的是加了大数值为什么要取模1000000007代码class Solution { public int cuttingRope(int n) { if (n == 1 || n == 2) { return 1; }原创 2021-04-11 15:05:26 · 66 阅读 · 0 评论 -
剑指 Offer 15. 二进制中1的个数
剑指 Offer 15. 二进制中1的个数链接思路1、库函数2、按位与代码库函数按位与链接剑指 Offer 15. 二进制中1的个数思路1、库函数Java 中的 Integer.bitCount(int n) 方法可以统计整数中 1 的个数2、按位与将n 与 n - 1进行按位与运算,即可将n中最右边的1变成0,进行多少次这样的运算,则n的二进制中就有多少个1代码库函数public class Solution { // you need to treat n as an un原创 2021-04-11 15:30:11 · 72 阅读 · 0 评论 -
剑指 Offer 16. 数值的整数次方
剑指 Offer 16. 数值的整数次方链接思路代码链接剑指 Offer 16. 数值的整数次方思路分开计算,每次算n的一半进行求幂,再将余数进行相乘代码class Solution { public double myPow(double x, int n) { if (n == 0) { return 1; } if (1 == n) { re原创 2021-04-11 16:58:38 · 103 阅读 · 0 评论 -
剑指 Offer 17. 打印从1到最大的n位数
剑指 Offer 17. 打印从1到最大的n位数链接思路代码链接剑指 Offer 17. 打印从1到最大的n位数思路将要打印的数字作为字符串追加到一个stringBuilder对象后,进行操作代码class Solution { public int[] printNumbers(int n) { StringBuilder stringBuilder = new StringBuilder(); int i = 0; while原创 2021-04-12 15:28:43 · 54 阅读 · 0 评论 -
剑指 Offer 18. 删除链表的节点
剑指 Offer 18. 删除链表的节点链接思路代码链接剑指 Offer 18. 删除链表的节点思路首先对特殊情况进行判断:1、空链表直接返回空2、只有一个节点且该节点为要被删除的结点(返回空)3、要删除的是头结点(返回头结点的下一节点)4、普通情况(但是要注意的是最后一定要赋空,否则会导致删不掉最后一个)代码/** * Definition for singly-linked list. * public class ListNode { * int val; *原创 2021-04-12 15:53:50 · 54 阅读 · 0 评论 -
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面
剑指 Offer 21. 调整数组顺序使奇数位于偶数前面链接思路代码链接剑指 Offer 21. 调整数组顺序使奇数位于偶数前面思路原地遍历将左边的偶数与右边的奇数进行交换代码class Solution { public int[] exchange(int[] nums) { int left = 0, right = nums.length - 1; while (left < right) {原创 2021-04-12 16:04:39 · 52 阅读 · 0 评论 -
剑指 Offer 24. 反转链表
剑指 Offer 24. 反转链表链接思路一、二、代码一、二、链接剑指 Offer 24. 反转链表思路一、将链表拆开进行尾插,同时要用一个新的头结点作为新的链表头二、将链表拆开进行头插代码一、/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode(int x) { val = x; } * }原创 2021-04-13 15:24:30 · 65 阅读 · 0 评论 -
剑指 Offer 25. 合并两个排序的链表
剑指 Offer 25. 合并两个排序的链表链接思路代码链接剑指 Offer 25. 合并两个排序的链表合并两个升序链表思路首先判断头结点,然后将两个链表进行拆分插入(取头结点较小的插入,插入后头结点后移),最后插入完则必然会有一个链表没有被完全插入,进行直接拼接即可代码/** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; *原创 2021-04-13 18:21:48 · 69 阅读 · 2 评论 -
剑指 Offer 29. 顺时针打印矩阵
剑指 Offer 29. 顺时针打印矩阵链接思路代码链接剑指 Offer 29. 顺时针打印矩阵螺旋方阵思路按顺序进行遍历(具体细节注释在代码里)代码class Solution { public int[] spiralOrder(int[][] matrix) { int row = matrix.length; if (row == 0) //输入为空则退出 { return new int[0原创 2021-04-18 19:47:00 · 101 阅读 · 3 评论 -
剑指 Offer 30. 包含min函数的栈
剑指 Offer 30. 包含min函数的栈链接思路一、用Deque实现二、用栈实现代码一、用Deque实现二、用栈实现链接剑指 Offer 30. 包含min函数的栈最小栈思路一、用Deque实现用Deque 模拟栈,用一个普通栈来进行数据的压入弹出,再定义一个最小栈来进行获取最小值二、用栈实现用两个栈来模拟实现代码一、用Deque实现import java.util.Deque;import java.util.LinkedList;import java.util.Stac原创 2021-04-18 20:13:31 · 120 阅读 · 2 评论 -
剑指 Offer 31. 栈的压入、弹出序列
剑指 Offer 31. 栈的压入、弹出序列链接代码链接剑指 Offer 31. 栈的压入、弹出序列栈的压入、弹出序列代码import java.util.ArrayList;import java.util.Deque;import java.util.LinkedList;import java.util.List;/** * @author 枳洛淮南 * @version 1.0 * @Description 剑指 Offer 31. 栈的压入、弹出序列 * @Date原创 2021-04-19 21:22:42 · 64 阅读 · 0 评论 -
剑指 Offer 32 - I. 从上到下打印二叉树
剑指 Offer 32 - I. 从上到下打印二叉树链接思路代码链接剑指 Offer 32 - I. 从上到下打印二叉树二叉树的层序遍历思路代码class Solution { public int[] levelOrder(TreeNode root) { if (root == null) { return new int[0]; } Queue<TreeNode> que原创 2021-04-20 10:36:49 · 58 阅读 · 1 评论 -
插入排序
插入排序import java.io.*;/** * @author 枳洛淮南 * @version 1.0 * @Description 功能 * @Date 2021/4/15 下午 15:26 */public class Main{ public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputS原创 2021-04-20 21:17:09 · 130 阅读 · 3 评论 -
剑指 Offer 40. 最小的k个数
剑指 Offer 40. 最小的k个数链接思路一、库函数二、冒泡排序三、折半插入排序四、插入排序五、选择排序六、选择排序变形代码一、库函数二、冒泡排序三、折半插入排序四、插入排序五、选择排序六、选择排序变形链接剑指 Offer 40. 最小的k个数排序相关算法思路一、库函数直接调用 Java util 包里的Arrays中的排序方法,将数组进行排序,并输出前k个数二、冒泡排序用冒泡排序对数组进行排序,输出前k个数(是真的慢)三、折半插入排序用折半插入排序对数组进行排序,输出前k个数四、原创 2021-04-21 00:03:21 · 374 阅读 · 7 评论 -
剑指 Offer 39. 数组中出现次数超过一半的数字
剑指 Offer 39. 数组中出现次数超过一半的数字链接思路map摩尔投票排序代码map摩尔投票排序链接添加链接描述思路map遍历数组,同时用一个map的键来存储数组中出现的数,用map的值来存储数的出现次数,最后,遍历map,如果map中某个键对应的值超过了数组的一半,则将其返回,由于题目设置,势必存在,在循环外返回-1(即数组中没有一个数出现次数超过数组中数字的一半)摩尔投票遍历数组,如果count 为0,则将该数赋值给card,然后遍历之后的数字,相同则加1,不同则减一,遍历完成之后,原创 2021-04-21 16:47:11 · 69 阅读 · 1 评论 -
剑指 Offer 53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字链接解法遍历代码二分代码双指针链接剑指 Offer 53 - II. 0~n-1中缺失的数字解法遍历使用一个数组,该数组长度为原数组长度+1,遍历原数组,新数组中下标为原数组中元素,则将其赋值为1,否则不用管则为0,遍历新数组,返回元素为1的下标,即为原数组中丢失的数字代码class Solution { public int missingNumber(int[] nums) { //递增,排序原创 2021-05-25 11:11:17 · 156 阅读 · 1 评论 -
剑指 Offer 57. 和为s的两个数字
剑指 Offer 57. 和为s的两个数字链接代码链接剑指 Offer 57. 和为s的两个数字代码public int[] twoSum(int[] nums, int target) { //递增,有序 int left = 0, right = nums.length - 1; while (left <= right) { //左右两数和 int mid = num原创 2021-05-25 11:34:10 · 100 阅读 · 1 评论 -
剑指 Offer 62. 圆圈中最后剩下的数字
剑指 Offer 62. 圆圈中最后剩下的数字约瑟夫环问题链接解法链表解法公式法约瑟夫环问题约瑟夫环问题是个著名的问题:N个人围成一圈,第一个人从1开始报数,报M的将被杀掉,下一个人接着从1开始报。如此反复,最后剩下一个,求最后的胜利者。例如只有三个人,把他们叫做A、B、C,他们围成一圈,从A开始报数,假设报2的人被杀掉。首先A开始报数,他报1。侥幸逃过一劫。然后轮到B报数,他报2。非常惨,他被杀了C接着从1开始报数接着轮到A报数,他报2。也被杀死了。最终胜利者是C链接剑指 Offe原创 2021-05-25 15:49:06 · 438 阅读 · 8 评论 -
剑指 Offer 65. 不用加减乘除做加法
剑指 Offer 65. 不用加减乘除做加法链接思路代码链接剑指 Offer 65. 不用加减乘除做加法思路^ 亦或 ----相当于 无进位的求和, 想象10进制下的模拟情况:(如:19+1=20;无进位求和就是10,而非20;因为它不管进位情况)& 与 ----相当于求每位的进位数, 先看定义:1&1=1;1&0=0;0&0=0;即都为1的时候才为1,正好可以模拟进位数的情况,还是想象10进制下模拟情况:(9+1=10,如果是用&的思路来处理,则9+1得到原创 2021-05-31 16:17:39 · 82 阅读 · 1 评论 -
剑指 Offer 50. 第一个只出现一次的字符
剑指 Offer 50. 第一个只出现一次的字符连接思路代码连接剑指 Offer 50. 第一个只出现一次的字符思路创建一个字典数组,遍历一次将字符串中出现过的字母次数存进字典数组,再遍历一次字符串,将首次出现次数为 1 的字母输出,没有为 1 次数的字母的话就返回 ’ ’代码class Solution { public char firstUniqChar(String s) { if ("".equals(s)) {原创 2021-06-01 11:26:04 · 73 阅读 · 0 评论