![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指Offer
软件园里卖煎饼
以文载意,以理铸心
展开
-
剑指Offer.JZ17.树的子结构
解题思路递归将每一个节点与Tree2进行比较,全部相同返回的true否则返回false代码/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { public boolea原创 2021-03-12 12:14:28 · 77 阅读 · 0 评论 -
剑指Offer.JZ18.二叉树的镜像
解题思路利用递归的思想将每一行的节点位置进行交换,最终得到的就是一个镜像树代码import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param pRoot TreeNode类 * @return TreeNode类 */ public TreeNode Mirror (TreeNode pR原创 2021-03-12 11:46:09 · 77 阅读 · 0 评论 -
剑指Offer.JZ58.对称的二叉树
解题思路利用dfs对左右节点进行递归代码/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/import java.util.LinkedList;public class Solution { boolean is原创 2021-03-12 11:27:49 · 71 阅读 · 0 评论 -
剑指Offer.JZ60.把二叉树打印成多行
解题思路利用Queue策略进行打印代码import java.util.*;/*public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/public class Solution { ArrayList<Array原创 2021-03-12 10:35:57 · 77 阅读 · 0 评论 -
每日一题:227. 基本计算器 II
解题思路转化成逆波兰表达式再进行计算可能是转逆波兰表达式的过程时间复杂度太高最后通过案例108/109个代码import java.util.*;class Solution { public int calculate(String s) { String expression = behindToAfter(s.replaceAll(" ","")); return calcu(expression); } public static S原创 2021-03-12 10:35:35 · 60 阅读 · 0 评论 -
剑指Offer.JZ65.矩阵中的路径
解题思路利用dfs进行当前位置判断与探索下一个节点难点:需要进行回溯操作,因为每个点都可以作为起点访问代码import java.util.*;public class Solution { public boolean hasPath (String matrix, int rows, int cols, String str) { if (matrix.length()==0){ return false; } c原创 2021-03-12 10:35:20 · 82 阅读 · 0 评论 -
剑指Offer.JZ66.机器人的运动范围
解题思路利用dfs进行当前位置判断与探索下一个节点需要判断的点:1.当前位置的r和c是否越界2.当前位置是否被访问过3.当前位置的rc是否小于限制代码import java.util.Arrays;public class Solution { public int movingCount(int threshold, int rows, int cols) { boolean[][] visted =new boolean[rows][cols];原创 2021-03-12 10:35:05 · 93 阅读 · 0 评论 -
剑指Offer.JZ5.用两个栈实现队列
解题思路stack1用来进行反转stack2用来当作真正的队列代码import java.util.Stack;public class Solution { Stack<Integer> stack1 = new Stack<Integer>(); Stack<Integer> stack2 = new Stack<Integer>(); public void push(int node) { whi原创 2021-03-12 10:34:53 · 65 阅读 · 0 评论 -
剑指Offer.JZ22.从上往下打印二叉树
解题思路利用队列的特点进行打印代码import java.util.ArrayList;import java.util.LinkedList;public class Solution { public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { ArrayList<Integer> ans = new ArrayList<>(); LinkedLis原创 2021-03-12 10:35:44 · 60 阅读 · 0 评论 -
剑指Offer.JZ44.翻转单词顺序列
解题思路将str拆分成一个个的单词然后拼串即可代码import java.util.ArrayList;import java.util.List;public class Solution { public String ReverseSentence(String str) { str=str+' '; List<String> stringList = new ArrayList<>(); char[] char原创 2021-03-12 10:34:38 · 64 阅读 · 0 评论 -
剑指Offer.JZ21.栈的压入、弹出序列
解题思路将push压入栈中,如果与pop[p2]相同则证明需要出栈代码import java.util.*;public class Solution { public boolean IsPopOrder(int [] pushA,int [] popA) { LinkedList<Integer> list = new LinkedList<>(); int p1=0,p2=0,lengthp1 = pushA.length,leng原创 2021-03-11 10:50:34 · 74 阅读 · 0 评论 -
剑指Offer.JZ10.矩形覆盖
解题思路 | 1 ,(n=0 ) (n) = | 1 ,(n=1 ) | 2*f(n-1),(n>=2) 代码public class Solution { public int jumpFloorII(int target) { /* | 1 ,(n=0 ) (n) = | 1 ,(n=1 )原创 2021-03-11 10:50:22 · 87 阅读 · 0 评论 -
剑指Offer.JZ9.变态跳台阶
解题思路 | 1 ,(n=0 ) (n) = | 1 ,(n=1 ) | 2*f(n-1),(n>=2) 代码public class Solution { public int jumpFloorII(int target) { /* | 1 ,(n=0 ) (n) = | 1 ,(n=1 )原创 2021-03-11 10:50:09 · 73 阅读 · 0 评论 -
剑指Offer.JZ64.滑动窗口的最大值
解题思路维护一个单调降序的双端队列代码import java.util.ArrayList;import java.util.LinkedList;public class JZ64 { public ArrayList<Integer> maxInWindows(int [] num, int size) { int right = size,left=0,length = num.length; int n = length-size+1;原创 2021-03-11 10:49:50 · 73 阅读 · 0 评论 -
剑指Offer.JZ49.把字符串转换成整数
解题思路将字符串进行判断以及拆分即可代码import java.util.ArrayList;import java.util.List;public class Solution { public int StrToInt(String str) { char[] chars = str.toCharArray(); int judge = 1; int n = str.length(); List<Integer&原创 2021-03-11 10:49:26 · 61 阅读 · 0 评论 -
剑指Offer.JZ47.求1+2+3+...+n
解题思路因为题目不能使用所有的判断语句,所以使用递归直到如果传入的n为0则返回0代码public class Solution { public int Sum_Solution(int n) { if (n==0) return 0; return n+Sum_Solution(n-1); }}...原创 2021-03-11 10:49:02 · 56 阅读 · 0 评论 -
剑指Offer.JZ46.孩子们的游戏(圆圈中最后剩下的数)
解题思路维护一个List看作是一个圆圈,并将每次被点到的小朋友编号移除用location表示当前小朋友位置,如果location==List.size(),那么需要将location变回为0代码 if (n<=0) return -1; int ans = 0; List<Integer> child = new ArrayList<>(); for (int i=0;i<n;i++){ ch原创 2021-03-11 10:48:48 · 75 阅读 · 0 评论 -
剑指Offer.JZ50.数组中重复的数字
解题思路利用HashMap代码import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param numbers int整型一维数组 * @return int整型 */ public int duplicate (int[] numbers) { HashMap<I原创 2021-03-11 10:49:12 · 63 阅读 · 0 评论 -
剑指Offer.JZ45.扑克牌顺子
解题思路先将数组当中的0的个数读出来,因为0的个数代表了大小王的个数,可以当作任意字符,如果两个数字直接的差值大于1那么就说明这两个数字之间至少缺少了一位数字,然后用0去补足,如果0的个数最后等于0那么就说明可以组成顺子代码/**import java.util.*;public class Solution { public boolean IsContinuous(int [] numbers) { if (numbers.length==0){原创 2021-03-11 10:48:33 · 67 阅读 · 0 评论 -
剑指Offer.JZ43.左旋转字符串
解题思路用dfs遍历并记录每个地方的深度,然后取最大值代码public class Solution { public String LeftRotateString(String str,int n) { int length = str.length(); if (n>length){ return ""; } String after = str.substring(n,length);原创 2021-03-11 10:48:22 · 67 阅读 · 0 评论 -
剑指Offer.JZ41.和为S的连续正数序列
解题思路穷举法代码import java.util.ArrayList;public class Solution { public ArrayList<ArrayList<Integer> > FindContinuousSequence(int sum) { ArrayList<ArrayList<Integer>> ans = new ArrayList<>(); for (int i=1;i&原创 2021-03-10 14:02:03 · 59 阅读 · 0 评论 -
剑指Offer.JZ42.和为S的两个数字
解题思路数组遍历两个指针一左一右如果符合条件就加入到Map中然后在Map中找到符合题意得乘积最小值因为是个递增数列所以数组的遍历只需要到大于sum的地方即可并且在返回的list中前一个是array[left]因为left小于right代码/**import java.util.*;public class Solution { public ArrayList<Integer> FindNumbersWithSum(int [] array,int sum) {原创 2021-03-10 13:53:04 · 54 阅读 · 0 评论 -
剑指Offer.JZ38.二叉树的深度
解题思路用dfs遍历并记录每个地方的深度,然后取最大值代码/**public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; }}*/import java.util.ArrayList;import java.util.*;public cl原创 2021-03-10 12:39:49 · 70 阅读 · 0 评论 -
剑指Offer.JZ37.数字在排序数组中出现的次数
解题思路简单HashMap统计即可代码import java.util.HashMap;public class Solution { public int GetNumberOfK(int [] array , int k) { int n = array.length; HashMap<Integer, Integer> map = new HashMap<>(); for (int i=0;i<n;i++){原创 2021-03-10 12:21:50 · 72 阅读 · 0 评论 -
剑指Offer.JZ40.数组中只出现一次的数字
解题思路依次取出两个链表的每个节点将节点存到List中然后遍历两个list,如果equal就返回这个节点代码import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */ public int[] Fin原创 2021-03-10 12:15:50 · 70 阅读 · 0 评论 -
剑指Offer.JZ36.两个链表的第一个公共结点
解题思路依次取出两个链表的每个节点将节点存到List中然后遍历两个list,如果equal就返回这个节点代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/import java.util.ArrayList;import java.util.List;public class Solution原创 2021-03-10 12:08:42 · 68 阅读 · 0 评论 -
剑指Offer.JZ32.把数组排成最小的数
解题思路递归找出每一种组合方式,将这些组合转换成字符串拼接,存到HashSet中,再把Set中的串全部转为Long存入到List中,再把List进行排序,取第一个值转为字符串即可代码import java.util.ArrayList;import java.util.*;public class Solution { public String PrintMinNumber(int [] numbers) { HashSet<String> set = ne原创 2021-03-10 11:39:27 · 71 阅读 · 0 评论 -
剑指Offer.JZ27.字符串的排列
解题思路利用递归将每个位置可能的字符全部遍历一遍并标记,进行拼串,如果字符串长度与str长度相同,那么久加入Set集合,这样同时也可以去除重复的排列比如ABC固定A->ABC->ACB固定B->BAC->BCA代码import java.util.ArrayList;import java.util.ArrayList;import java.util.Arrays;import java.util.HashSet;import java.util.Collect原创 2021-03-10 10:57:49 · 125 阅读 · 0 评论 -
剑指Offer.JZ34.第一个只出现一次的字符位置
解题思路利用HashMap记录每个字符出现的次数将每个字符的位置存到list中,再把list排序第一个数字就是最早出现的单词字符代码import java.util.*;public class Solution { public int FirstNotRepeatingChar(String str) { Map<Character,Integer> map = new HashMap<>(); char[] chars =原创 2021-03-10 10:13:16 · 58 阅读 · 0 评论 -
剑指Offer.JZ28.数组中出现次数超过一半的数字
解题思路用HashMap进行统计,将符合题目要求的值返回代码import java.util.HashMap;import java.util.Map;import java.util.Set;public class Solution { public int MoreThanHalfNum_Solution(int [] array) { Map<Integer,Integer> map = new HashMap<>(); i原创 2021-03-10 10:13:06 · 72 阅读 · 0 评论 -
剑指Offer.JZ31.整数中1出现的次数(从1到n整数中1出现的次数)
解题思路太简单了代码public class Solution { public int NumberOf1Between1AndN_Solution(int n) { int sum=0; for (int i=1;i<=n;i++){ sum+=search1(i); } return sum; } public int search1(int num){ int原创 2021-03-09 17:56:20 · 44 阅读 · 0 评论 -
剑指Offer.JZ30.连续子数组的最大和
解题思路动态规划维护一个ans数组代表下标所在数字能得到的最大和代码import java.util.Arrays;public class Solution { public int FindGreatestSumOfSubArray(int[] array) { int n = array.length; int[] ans = new int[n]; Arrays.fill(ans,-99999999);// for原创 2021-03-09 17:49:02 · 91 阅读 · 0 评论 -
剑指Offer.JZ29.最小的K个数
解题思路维护一个k个数的list,如果当前数小于list中的最大值,就remove list中的最大值,直到数组遍历完代码import java.util.ArrayList;import java.util.Collections;public class Solution { public ArrayList<Integer> GetLeastNumbers_Solution(int [] input, int k) { ArrayList<Integ原创 2021-03-09 17:16:57 · 67 阅读 · 0 评论 -
剑指Offer.JZ19.顺时针打印矩阵
解题思路找出数组的上下左右界限并不断缩减即可代码import java.util.ArrayList;public class Solution { public ArrayList<Integer> printMatrix(int [][] matrix) { ArrayList<Integer> ans = new ArrayList<>(); int left=0,up=0,down=matrix.length,rig原创 2021-03-09 17:05:37 · 65 阅读 · 0 评论 -
剑指Offer.JZ16.合并两个排序的链表
解题思路将两条链表遍历将小的数加入到新链表中再把没有遍历完的链表加入到新链表即可代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode Merge(ListNode list1,ListNode list2) {原创 2021-03-09 16:33:34 · 74 阅读 · 0 评论 -
剑指Offer.JZ15.反转链表
解题思路将每个节点依次取出创建出一条新链表得到的就是反转后的链表代码/*public class ListNode { int val; ListNode next = null; ListNode(int val) { this.val = val; }}*/public class Solution { public ListNode ReverseList(ListNode head) { ListNode ans原创 2021-03-09 15:58:37 · 68 阅读 · 0 评论 -
剑指Offer.JZ14.链表中倒数第k个结点
解题思路两次遍历,第一次得出链表长度第二次取到length-k的值代码import java.util.*;/* * public class ListNode { * int val; * ListNode next = null; * public ListNode(int val) { * this.val = val; * } * } */public class Solution { public ListNode FindKthTo原创 2021-03-09 15:49:39 · 73 阅读 · 0 评论 -
剑指Offer.JZ13.调整数组顺序使奇数位于偶数前面
解题思路维护两个list,一个用来存奇数一个用来存偶数,然后将两个list中的元素赋值到ans中即可代码import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param array int整型一维数组 * @return int整型一维数组 */ public int[] reOrder原创 2021-03-09 15:32:49 · 72 阅读 · 0 评论 -
剑指Offer.JZ12.数值的整数次方
解题思路分情况讨论即可 指数大于0 等于0 小于0代码public class Solution { public double Power(double base, int exponent) { int n=1; double num = base; while(n<Math.abs(exponent)){ num*=base; n++; } if (exp原创 2021-03-09 15:22:23 · 66 阅读 · 0 评论 -
剑指Offer.JZ8.跳台阶
解题思路进行递归第一种和第二种解法是递归第三种是因为这个题目符合斐波那契数列代码public class Solution { public int jumpFloor(int target) { return climb(0, target); } private int climb(int i, int n) { //表示当前台阶数大于总台阶数,很显然这种情况不符合,走不通,记为 0 if (i > n)原创 2021-03-08 17:17:32 · 58 阅读 · 0 评论