剑指offer算法题
小鱼爱吃菜
在探索真理的道路上也一定要热爱生活呀
展开
-
刷Letcode 当中遇到的java.lang.StringIndexOutOfBoundsException: String index out of range: 13 at line 48
当这个问题出现的时候,我自己都懵了,到底是哪里出错了,下面来给大家看看出错的代码:class Solution { public String replaceSpace(String s) { int length=s.length()*3; char[] str=new char[length]; int size=0; for(int i=0;i<length;i++){ char c=s.char.原创 2022-04-11 19:24:20 · 1168 阅读 · 0 评论 -
一篇文章教你如何刷Letcode进大厂
如何高效刷Letcode算法原创 2022-03-12 17:19:32 · 554 阅读 · 1 评论 -
剑指offer03解题详解+思路(LetCode解题)
题目在一个长度为n的数组nums里的所有数字都在0~n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。题目解析根据这道题,首先肯定是定义一个方法,然后方法体里面对应的属性是数组(方法一)首先我们可以使用一下官方的详解,我把它转化成了自己语言来解答。(实际上就是用Set来建立一个集合来存储这个数组中的数据,当存在两个相同的东西的时候,就进行一个返回即可)class Solution { public int fin原创 2021-09-28 22:13:56 · 113 阅读 · 0 评论 -
剑指offer42(连续子数组的最大和)
题目输入一个整型数组,数组中的一个或者多个整型数字组成一个子数组。求所有子数组和的最大值解析首先,我们可以知道,我们是在一个数组中求出连续数字的和,这个连续的数组中,可能只含有一个数字,也可能含有多个数字,所以我们在这里不要害怕,马上明怀我来带领大家分析一波。首先就是既然是相加的,那么我们就要保证连续加起来的数字是最大的,那么就需要用到for循环来一个遍历,但是,当第一个数是负数的话,又会拖后退,所以,我们选择的第一个数字肯定是要大于0的,那么如何来进行选择这个数字是大于0的呢(因为我们 要遍历呀,原创 2021-09-25 12:04:35 · 90 阅读 · 0 评论 -
剑指offer39.字符串的排列
题目输入一个字符串,打印出该字符串中字符的所有排列。例如[a,b,c],打印出来就对应的是[“abc”,“acb”,“bac”,“bca",“cba”,“cab”]这样的序列。解题思路首先根据这道题目我们需要思考的就是,我们在函数当中是要最先引入这个字符串的,假设把它设置为s,那么就要在里面对s进行一个引入,我们可以设置char[] c=s.toCharArray(),接下来要做的就是设置一个函数,用来使得每一次遍历出来的都和上次的顺序不一样,以此来达到多种遍历的效果,那么我们如何来进行遍历呢?首先原创 2021-09-22 09:12:12 · 82 阅读 · 0 评论 -
剑指offer36.二叉搜索树与双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。思路首先本题是想弄一个递增的序列,那么我们首先想到的就是遍历二叉树的中序,这样就能出来有序的例子,接下来需要做的就是将二叉搜索树转换成一个“排序的循环双向链表”,包含三要素:排序链表:节点应从小到大排序,因此应该原创 2021-09-17 12:26:59 · 80 阅读 · 0 评论 -
二叉树中和为某一值的路径(剑指offer 34)
题目输入一颗二叉树和一个整数,打印出二叉树中节点值的和为输入整数的所有路径。从树的根节点开始一直到树的叶子节点形成的路径。解题思路先序遍历: 本题我采用的是先序遍历树的所有节点,也就是按照根、左、右的顺序。详细思路: 由于本题目是一个将二叉树对应的路径给输出,所有需要两个方法,一个是专门负责进行递推,将所有符合的节点都输出,另一个就是负责将这个结果列表进行一个返回。两个方法:pathSum(root,sum)函数:初始化:结果列表res,路径列表path返回值:返回res即可recur原创 2021-09-15 12:15:50 · 87 阅读 · 0 评论 -
剑指offer(二叉树的后序搜索遍历)
题目给定一个供参考的二叉搜索树,然后根据输入的序列来判断其是否是一个后序遍历的结果,如果是的话,就返回true,否则就返回false。思路首先我们就想到的是,在一个方法中进行判断,通过这个方法,里面的参数可以进行一个设置。接下来就是划分它的左右子树,遍历后序区间[i,j]的元素,比如[i,m-1]代表左子树节点对应的所有区间,右子树区间就在[m,j-1]中,当遇到<=postorder[j]的节点则退出。代码class Solution{ public boolean verify原创 2021-09-14 13:14:49 · 60 阅读 · 0 评论 -
剑指offer32(从上到下打印二叉树)
题目从上到下打印二叉树的节点,同一层的节点按照从左到右的顺序去打印。题解首先是定义这个二叉树,TreeNode root,当它为空的时候,直接返回new int[0],用队列来对这个二叉树形成一个链表的形式,也就是Queue<TreeNode> queue=new LinkList<>{{add(root);}};那么除了这个树之外,还要构建一个数组,用来存取弹出来的二叉树,也就是定义一个ArrayList<Integer> ans=new ArrayList&l原创 2021-09-11 10:11:48 · 55 阅读 · 0 评论 -
剑指offer顺时针打印矩阵
题目输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。解题思路首先我们可以自己画一个矩阵,然后根据顺时针的方式从外向里打印出来,如下图所示:考虑到它的每一个边界的话,注意看图,当我从左遍历到右边的时候,是不是上边界就变大了,然后加以=1,判断t大于b从上到下,也就是说,当遍历完之后,发现的就是有边界r减一,判断l是否>r从右向左,遍历完了之后,发现的是下边界存在变化,也就是下边界加1,这个时候就是判断是否下边界小于上边界t从下向上的话,就是左边界加1,判断左边界是否大于原创 2021-09-08 11:34:53 · 60 阅读 · 0 评论 -
剑指offer28.对称的二叉树
题目请实现一个函数,用来判断一棵二叉树是不是堆成的,如果一棵二叉树和它的镜像一样,那么它就是堆成的。思路看了这张图,你可能会有一点点思路,上图就是一对称的二叉树,首先就是说,假如这个二叉树只有根节点,其他节点都不存在的话,那么这也是一个对称的二叉树,也就是说,当L.valnull&&R.valnull的时候,就是对称的,除此之外,仅仅有一个L.val为空或者一个R.val为空,都不能满足对称二叉树的这样一个过程,接下来,我们就建立这样一个方法,这个方法的名字就叫做recur(Tree原创 2021-09-07 13:34:01 · 52 阅读 · 0 评论 -
剑指offer之二叉树的镜像
题目通过输入一个二叉树,首先是按照顺序依次从第一层到最底层,然后再进行顺序上面的调整。题解class Solution{ public TreeNode mirrorTree(TreeNode root){ if(root==null)return null; TreeNode tmp=root.left; root.left=mirrorTree(root.right); root.right=mirrorTree(tmp); return原创 2021-09-06 21:30:03 · 48 阅读 · 0 评论 -
合并两个排序的列表
题目输入两个递增排序的列表,合并这两个链表并使新链表的节点仍然是递增排序的。题解这个就是说,我们可以用两个指针来进行定义当然了,这是一个合并列表,于是呢,我们就需要首先设置一个组合的链表,于是呢,这个组合链表就是class Solution{ public ListNode mergeTwoLists(ListNode l1,ListNode l2){ ListNode dum=new ListNode(0),cur=dum; while(l1!=null&&原创 2021-09-04 20:15:21 · 199 阅读 · 0 评论 -
剑指offer24(反转链表)
题目定义一个函数,输入一个链表的头节点,反转该链表并输出反转后链表的头节点举例输入:1->2->3->4->5->null输出:5->4->3->2->1->null题解上图是明怀我根据思路自己手写的一部分关于这道算法题的思路,也就是说,首先,题目是想让我们把反转后链表的头节点给输入出来,那么我们首先就要用ListNode cur=head来定义一个头节点,然后呢,就是有另外的一个tmp指针,来跟随着着这个cur一起移动,好了,话不多原创 2021-09-03 14:03:09 · 74 阅读 · 0 评论 -
剑指offer22(链表中倒数第k个节点)
题目输入一个链表,输出该链表中倒数第k个节点解题代码class Solution public ListNode getKthFromEnd(ListNode head,int k){ ListNode former=head,latter=head; for(int i=0;i<k;i++){ former=former.next; } while(former!=null){ former=former.next; latter=latter.next;原创 2021-09-02 17:24:10 · 68 阅读 · 0 评论 -
剑指offer(调整数组顺序,使奇数位于偶数前面)
题目输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。解题思路首先就是定义两个指针i和j,分别从最左边和最右边同时开始遍历,当碰到是奇数的时候,两个指针进行交换位置,当在i判断的时候对应的是奇数的话,就会跳过,然后继续往后遍历,然后判断当j是偶数的话,也是继续跳过,往前继续看,看是否也含有对应的,如果都不是的话,就交换一下位置代码public class Solution { public int[] exchange(i原创 2021-09-01 17:17:54 · 51 阅读 · 0 评论 -
剑指offer20(表示数值的字符串)
题目:判断输入的一个字符串是否是字符package page1;import java.util.HashMap;import java.util.Map;import java.util.Scanner;public class Solution { public boolean isNumber(String s) { Map[] states = { new HashMap<>() {{ put(' ', 0); put原创 2021-08-31 21:29:41 · 49 阅读 · 0 评论 -
剑指offer16.数值的整数次方
代码:package page1;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner;public class Solution { public double myPow(double x, int n) { if(x == 0) return 0; long b = n; double res = 1.0;原创 2021-08-29 17:37:39 · 45 阅读 · 0 评论 -
剑指Offer第15题(二进制的解)
题目输入一个数字,判断这个数字对应的32位二进制中含有1的个数,并且返回这个个数题解package page1;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.Scanner;public class Solution { public int hamint(int n) { int ret = 0; for (int i = 0; i &原创 2021-08-29 17:00:19 · 71 阅读 · 0 评论 -
剑指offer(第十一题:旋转数组的最小数字)
题目把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素。例如,数组[3,4,5,1,2]为[1,2,3,4,5]的一个旋转,该数组的最小值为1实例输入:【3,4,5,1,2】输出:1实例2输入:【2,2,2,0,1】输出:0解题思路本题目我们可以运用二分查找的方法来进行一个解答,因为是一个递增的数组,所以从左到右是依次递增的,假设这个数组是int[] m,则m[0]是很大可能小于右边的,那么,我们在进行计算的时候,可以原创 2021-07-04 11:55:47 · 61 阅读 · 0 评论 -
剑指offer(第10题:斐波那契数列)
题目写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项(即 F(N))。斐波那契数列的定义如下:F(0) = 0, F(1) = 1F(N) = F(N - 1) + F(N - 2), 其中 N > 1.斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。实例1:输入:n = 2输出:1实例2:输入:n = 5输出:5解题思原创 2021-07-03 10:57:11 · 123 阅读 · 1 评论 -
剑指offer(第九题:用两个栈实现队列)
题目用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead操作返回-1)实列1输入:[“CQueue”,“appendTail”,“deleteHead”,“deleteHead”][[ ],[3],[ ],[ ] ]输出:[null,null,3,-1]实例2输入:[“CQueue”,“deleteHead”,“appendTail”,“delete原创 2021-07-02 13:17:21 · 80 阅读 · 0 评论 -
剑指offer(第七题:重建二叉树)
题目输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。实例例如,给出前序遍历 preorder = [3,9,20,15,7]中序遍历 inorder = [9,3,15,20,7]返回如下的二叉树:3/ \9 20 /\ 15 7记住,15和7分别是在20的左右两边,这个是很重要的。先序遍历和中序遍历解释先序遍历首先,先序遍历指的就是首先遍历根节点,然后从左边开始遍历一直到左子树,随后递归地原创 2021-06-30 22:13:14 · 73 阅读 · 0 评论 -
剑指offer(第五题:替换空格)
题目请实现一个函数,把字符串s中的每个空格替换成"%20"实例输入:s=“we are happy"输出:”we%20are%20happy"解答首先,根据题目我们可以发现,输入字符串的长度远远要小于输出的字符串的长度,于是我们可以设置输入时候的字符串的长度是s,那么输出之后的字符串的长度可以设置为3s,这个本人亲测,没问题获得s的长度length创建字符数组,其长度为length*3初始化size为0,size表示替换后的字符串的长度从左到右遍历字符串s遍历结束后,size的值等于原创 2021-06-26 15:56:39 · 73 阅读 · 0 评论 -
剑指offer(第四题:二维数组中的查找)
题目:在一个n*m的二维数组当中,每一行都按照从左到右递增的顺序进行排序,每一列都按照从上到下递增的顺序排序。请完成一个高效的函数,输入这样的一个二维数组和整数,判断数组中是否含有该整数暴力求解说到暴力求解,就是说根据这个二位数组,进行行数和列数的遍历,时间复杂度:O(nm)。二维数组中的每个元素都被遍历,因此时间复杂度为二维数组的大小空间复杂度O(1)现在就是对这个数组进行的解决public class Test { public Boolean find(int[][] mat原创 2021-06-25 14:23:22 · 106 阅读 · 1 评论