剑指offer
刷题的基础
念殊15
这个作者很懒,什么都没留下…
展开
-
对无序链表归并排序
1.代码public class Solution { public ListNode sortList(ListNode head) { // 链表结束的条件 if(head == null || head.next == null){ return head; } // 使用归并排序(从底部开始排序,左右两部分,进行链表合并) ListNode mid = middleNode(head)原创 2020-08-21 15:07:46 · 360 阅读 · 0 评论 -
把二叉树打印成多行
1.题目2.解法(队列)import java.util.ArrayList;import java.util.ArrayDeque;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Sol原创 2020-07-02 14:30:25 · 95 阅读 · 0 评论 -
按之字形顺序打印二叉树
1.题目2.解法(双栈法)import java.util.Queue;import java.util.ArrayList;import java.util.Stack;public class Solution { public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) { ArrayList<ArrayList<Integer>> arr = new Arra原创 2020-07-02 13:45:35 · 95 阅读 · 0 评论 -
对称的二叉树
1.题目2.解法使用的是递归法public class Solution { boolean isSymmetrical(TreeNode pRoot) { // 给的样例中,说如果pRoot为null,那么对称 return pRoot == null || isSym(pRoot.left, pRoot.right); } boolean isSym(TreeNode tmp1, TreeNode tmp2){原创 2020-06-28 10:59:23 · 107 阅读 · 0 评论 -
二叉树的下一个结点
1.题目2.解法public class Solution { // 将树的情况整个分析 public TreeLinkNode GetNext(TreeLinkNode pNode) { if(pNode == null){ return null; } // 如果右结点不为空,那么就是右结点最左结点,否则就是自身 if(pNode.right != null){原创 2020-06-28 09:50:28 · 169 阅读 · 1 评论 -
删除链表中重复的结点
1.题目2.解法(遍历法)public class Solution { public ListNode deleteDuplication(ListNode pHead) { // 记得pHead.next == null,return null,这只针对特定链表,不用在哪里都用 if(pHead == null){ return null; } // 利用虚假头结点 ListNo原创 2020-06-27 20:15:56 · 91 阅读 · 0 评论 -
链表中环的入口点
1.题目2.解法(快慢指针)/* public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode EntryNodeOfLoop(ListNode pHead) { // 定义快慢指针,找到相遇的点原创 2020-06-26 20:08:27 · 169 阅读 · 0 评论 -
字符流中第一个不重复的字符
1.题目2.解法1:每次都遍历:public class Solution { // String str不赋初始值为null,str += ch, ch = 'h', 会变成nullh private String str = ""; private int[] arr = new int[256]; //Insert one char from stringstream public void Insert(char ch) { str +原创 2020-06-25 13:04:44 · 197 阅读 · 0 评论 -
表示数值的字符串
1.题目2.解法(正则表达式)为了方便说明,所以把每个字符分开了import java.util.regex.Pattern;public class Solution { public boolean isNumeric(char[] str) { // ^和$框定正则表达式 [+-]只有括号内的字符才参与匹配,只匹配单个字符, ?代表+或者-只出现0次或者1次 String p1 = "^[+-]?"; // \d在java中有特殊含原创 2020-06-25 10:47:30 · 238 阅读 · 0 评论 -
正则表达式匹配(超级重要,因为difficult)
1.题目2.解法(动态规划)public class Solution { // 1.实现一个匹配函数 public boolean match(char[] str, char[] pattern) { if(str == null || pattern == null) return false; // 设置状态数组 boolean[][] dp = new boolean[str.length+1][pattern.len原创 2020-06-23 14:43:46 · 170 阅读 · 0 评论 -
构建乘积数组
1.题目2.解法public class Solution { public int[] multiply(int[] A) { /** * 可分为左右两部分两乘 * left[i] = A[0] * A[1] * ... * A[i-1] * right[i] = A[i+1] * A[i+2] * .. *A[n-1] * B[i] = left[i] * right[i] */原创 2020-06-20 19:37:35 · 82 阅读 · 0 评论 -
数组中重复的数字
1.题目2.解法1(空间复杂度nlogn)先使用排序算法,接着看相邻元素是不是相等import java.util.*;public class Solution { public boolean duplicate(int numbers[],int length,int [] duplication) { if(numbers == null || length == 0){ return false; } Ar原创 2020-06-20 15:49:43 · 273 阅读 · 0 评论 -
把字符串转换为整数
1.题目2.解法(边界测试)public class Solution { public int StrToInt(String str) { int len = str.length(); if (str == null || len == 0) { return 0; } // 排除开头的空格(也可用str.trim()排除空格 int i = 0; while (i原创 2020-06-18 15:31:58 · 1545 阅读 · 0 评论 -
不用加减乘除做加法
1.题目2.解法(位运算)思路:(1)十进制中,17 + 5,求和分为二步走:各位相加,先不进位,1+0=1, 7+5=2, 结果为12接着进位,7+5进位1, 所以为10现在变成12 + 10,接着和前两步相同的方式,相加,1+1=2, 2+0=2, 等于22,此时没有进位了,所以结果为22可以看出前两步为循环体,有进位为循环条件(2)和十进制类似的方式17的二进制为10001, 5为101-每位相加,先不进位,10100(相加操作由位运算异或完成,相同为0,不同为1,1+0=1,原创 2020-06-18 10:38:45 · 98 阅读 · 0 评论 -
求1+2+3+...+n
1.题目2.解法利用的是短路原理作为"&&“和”||"操作符的操作数表达式,这些表达式在进行求值时,只要最终的结果已经可以确定是真或假,求值过程便告终止,这称之为短路求值(short-circuit evaluation)。假如expr1和expr2都是表达式,在下面这个逻辑表达式的求值过程中:1.expr1的值为0:expr1 && expr2expr2将不会进行求值,因为整个逻辑表达式的值已经可以确定为0。2.expr1的值为1:expr1 || ex原创 2020-06-18 09:44:49 · 174 阅读 · 0 评论 -
孩子们的游戏(圆圈中最后剩下的数)
1.题目2.解法(for循环)public class Solution { public int LastRemaining_Solution(int n, int m) { // 没有小朋友 if(n < 1 || m < 1){ return -1; } int count = 0; // 记录出圈的小朋友 boolean原创 2020-06-16 18:49:05 · 113 阅读 · 0 评论 -
扑克牌顺子
1.题目(记得先把题目读懂。。。。2.解法import java.util.Arrays;public class Solution { // numbers代表抽出的5张牌 public boolean isContinuous(int [] numbers) { int len = numbers.length; if(numbers == null || len < 5){ return false;原创 2020-06-16 16:15:14 · 81 阅读 · 0 评论 -
左旋转字符串
1.题目2.解法(三次翻转法)public class Solution { private char[] arr; public void reverse(int begin, int end) { char tmp; // 交换字符的位置 while (begin < end) { tmp = arr[begin]; arr[begin] = arr[end];原创 2020-06-15 16:12:01 · 86 阅读 · 0 评论 -
翻转单词顺序列
1.题目2.解法(两次翻转法,遍历)public class Solution { private char[] arr; public void reverse(int begin, int end){ char tmp; // 交换字符的位置 while(begin < end){ tmp = arr[begin]; arr[begin] = arr[end];原创 2020-06-14 20:32:38 · 232 阅读 · 0 评论 -
和为s的连续正数序列
1.题目2.解法( 穷举法)import java.util.ArrayList;public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> list = new ArrayList<>(); // 因为要求是正原创 2020-06-14 19:23:35 · 127 阅读 · 0 评论 -
和为S的两个数字
1.题目2.解法import java.util.ArrayList;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) { ArrayList<Integer> aList = new ArrayList<>(); if(array == null || array.length < 2原创 2020-06-12 14:54:15 · 96 阅读 · 0 评论 -
数组中只出现1次的数字
1.题目2.解法1(归并排序+遍历)时间复杂度O(nlogn) + O(n),空间复杂度O(1)//num1,num2分别为长度为1的数组。传出参数//将num1[0],num2[0]设置为返回结果import java.util.ArrayList;import java.util.Arrays;import java.util.List;public class Solution { public void FindNumsAppearOnce(int[] array, in原创 2020-06-12 00:06:22 · 186 阅读 · 0 评论 -
数字在排序数组中出现的次数
1.题目2.思路和解法(二分法)看到排好序的数组,立马想到二分法,但若是按照找到一个k后,向左、向右遍历找的话,时间复杂度为O(n),所以我们不这样做,我们利用二分法缩小范围,找到第一个出现k的位置和最后一个出现k个位置,就可以计算k出现的情况。注意:1.特殊情况,第一,数组中无此数,第二,数组为空或者长度为02.end、start的范围写错public class Solution { public int GetNumberOfK(int [] array , int k) {原创 2020-06-11 23:03:25 · 115 阅读 · 0 评论 -
判断一棵树是不是平衡二叉树(重要)
1.题目2.分析和解答平衡二叉树,左右结点的深度相差小于等于1(1)第一版:按照上一题“二叉树的深度",我们可以判断左右结点的深度判断根结点是不是平衡的。但是我们不知道左结点和右结点是不是平衡,所以还需要判断左右结点是不是平衡。防止避免以下情况:...原创 2020-06-08 10:48:28 · 422 阅读 · 0 评论 -
二叉树的深度
1.题目2.分析与解答因为二叉树是由子二叉树构成的,所以先思考二叉树只有一层的情况如果二叉树只有一个根结点,深度为1有左结点无右结点,depth(左结点)+1有右结点无左结点,depth(右结点)+1既有左结点又有右结点, 左右结点深度进行比较/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int原创 2020-06-08 08:29:18 · 297 阅读 · 0 评论 -
两个链表的第一个公共结点
1.题目公共结点后面的结点都是相同的思路:第一种暴力法,每个结点和另外一个链表的所有的结点比较第二种栈法,把两个链表的结点放入栈中,利用后进先出的特点进行比较,需要额外的空间花费O(m+n)第三种就是遍历法,不需要花费空间2.解法/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public cl原创 2020-05-30 22:39:02 · 180 阅读 · 0 评论 -
数组中的逆序对
1.题目2.解法使用的是归并排序public class Solution { private int count = 0; private int mod = (int)1e9 + 7; private int[] copy = new int[200000]; public int InversePairs(int [] array) { int len = array.length; if(array == null |原创 2020-05-23 13:24:52 · 190 阅读 · 0 评论 -
第一个只出现一次的字符
1.题目2.解法思路:通过遍历整个字符数组,统计每个字符出现的次数,那么就设定char - count的键值对,这里是字母组合,根据ASCII码知道,可以预设一个包含一个128字符的数组。public class Solution { public static int FirstNotRepeatingChar(String str){ if(str == null || str.length() == 0) return -1; char[] chArr原创 2020-05-21 18:09:58 · 112 阅读 · 0 评论 -
丑数
1.题目2.思路1.首先一个数要可以被2,3,5其中的1个或者多个整除, 接着该数除以2, 3, 5, 获得的商是不是在2, 3, 5中,如果不是,那么它肯定不是丑数,这种思路是错误的,比如12,它由2x6构成,除以一次2获得商为6,不在,就判断为丑数了,肯定是错误的,应该继续除以2。2.所以判断是不是丑数的思路是public static boolean isUglyNumber(int number){ while(number % 2 == 0){ nu原创 2020-05-21 15:36:40 · 162 阅读 · 0 评论 -
把数组排成最小的数
1.题目2.解法(使用排序)思路:两两元素组合,比如3 和 32 , 332, 323, 比较谁大谁小,小的放前面, 32 3, 接着继续比较,这样的话,可以获得一个从小到大的组合。import java.util.ArrayList;import java.util.Comparator;import java.util.Collections;public class Solution { public String PrintMinNumber(int[] numbers)原创 2020-05-19 17:24:57 · 115 阅读 · 0 评论 -
剑指offer:连续子数组的最大和
1.题目2.解法 1(遍历)刚开始的思路是:假设有这样一个数组,为了防止第一个值为负数,所以 max = add = array[0]{1,-2,3,10,-4,7,2,-5}每进行一次累加,都需要判断add是否大于max值,若大的话直接替代这一步是包括了数组元素值为正负两种情况:- if(array[i] < 0){ if (add > max) max = add}如果此时该数组小于0,需要保存最大值,也需要add大于max值。-if(array[i] <原创 2020-05-18 17:13:16 · 92 阅读 · 0 评论 -
包含min函数的栈(Java实现)
1、题目题目解析:找到当前栈中元素的最小值2、解法import java.util.Stack; public class Solution { Stack<Integer> stk = new Stack<Integer>(); Stack<Integer> minStk = new Stack<Integer>();...原创 2020-04-01 11:21:42 · 195 阅读 · 0 评论 -
最大连续子序列乘积(Java实现)
1.题目给定一个整数数组 nums ,找出一个序列中乘积最大的连续子序列(该序列至少包含一个数)。2.解法public int FindMaxProduct(int[] nums) { if (nums == null || nums.length == 0) { return 0; } int max = nums[0], min ...原创 2020-03-23 22:35:44 · 478 阅读 · 0 评论 -
顺序打印矩阵(Java实现)
1.题目2.解法import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> arr = new ArrayList<>(); ...原创 2020-03-17 22:47:22 · 302 阅读 · 0 评论 -
树的子结构(Java实现)
1.题目2.解法public class Solution { public boolean HasSubtree(TreeNode root1,TreeNode root2) { if (root1 == null || root2 == null) return false; return Judge(root1, root2) ...原创 2020-03-17 21:58:07 · 239 阅读 · 0 评论 -
矩形覆盖(Java实现)
1、题目2.解法(递归)public class Solution { private int c1 = 1; private int c2 = -1; public int RectCover(int target) { if (target == 0) return 0; if (target <= 2) { ...原创 2020-03-17 20:36:37 · 222 阅读 · 0 评论 -
复杂链表的复制(Java实现)
1.题目2.解法/*public class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null; RandomListNode(int label) { this.label = label; }}*/pu...原创 2020-03-15 20:58:52 · 278 阅读 · 0 评论 -
字符串的排列
1.题目2.解法import java.util.ArrayList;import java.util.Collections;public class Solution { public ArrayList<String> Permutation(String str) { ArrayList<String> all = new Arra...原创 2020-03-15 20:10:23 · 61 阅读 · 0 评论 -
数组中出现次数超过一半的数字
1.题目2.解法public class Solution { public int MoreThanHalfNum_Solution(int [] array) { if(array == null || array.length == 0)return 0; int preValue = array[0];//用来记录上一次的记录 ...原创 2020-03-15 19:07:23 · 97 阅读 · 0 评论 -
最小的k个数
1.题目2.解法(使用插入排序)import java.util.ArrayList;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integer> r...原创 2020-03-15 18:39:25 · 57 阅读 · 0 评论