
笔记
快乐李同学(李俊德-大连理工大学)
B站/微博/微信公众号:快乐李同学。
大连理工大学软件工程2020毕业学生。
大连理工大学2018-2019学年科技创新奖学金。
2个国家级项目,2个国家级奖项,5个省级奖项,8个校级奖项(总项目经费和竞赛奖金达2万2千元)。
2018-2019年在中国核心期刊《现代计算机》发表2篇项目相关论文,分别署名第一、第二作者(知网可查)。
2018-2019年申请2份项目软件著作权,并发布软件(编程乐园、编程学院)到Google,腾讯,百度,华为,小米等应用商店。
大学英语六级568分。
展开
-
Java详解剑指offer面试题66--构建乘积数组
Java详解剑指offer面试题66–构建乘积数组给定一个数组A[0, 1,…n - 1],请构建一个数组A[0, 1,…n - 1],其中B中的元素B[i] = A[0]A[1]…*A[i - 1]A[i + 1]…*A[n - 1],不能使用除法。如果可以使用除法,直接除以A[i]就可以得到B[i],但是现在要求了不能使用除法,只好另辟蹊径了。一种方法是剔除A[i]进行连乘计算B[i],计算一次的时间是 O(n)O(n)O(n),需要计算n次所以总的时间复杂度为O(n2)O(n^2)O(n2)原创 2020-09-28 08:53:40 · 272 阅读 · 0 评论 -
Java详解剑指offer面试题62--圆圈中最后剩下的数字
Java详解剑指offer面试题62–圆圈中最后剩下的数字0, 1, 2…,n - 1这n个数字排成一个圆圈,一开始从数字0开始,从这个圆圈里删除第m个数字;然后从被删除的数字后一位开始计数,继续删除第m个数字…重复这个过程,直到最后只剩一个数字为止。求出这个圆圈里剩下的最后一个数字。用环形链表模拟圆圈比较直观的思路就是模拟游戏的过程,题目中说到圆圈而且要经常删除元素,因此容易想到用环形链表,但是Java内置的数据结构中没有环形链表,那么只好当遍历到链表末尾时转到链表头部。举个简单的例子{0,原创 2020-09-26 16:05:06 · 323 阅读 · 0 评论 -
Java详解剑指offer面试题60--n个骰子的点数
Java详解剑指offer面试题60–n个骰子的点数把n个骰子扔在地上,所有骰子朝上的一面的点数之和为s。输入n,打印出s的所有可能的值出现的概率。递归n个骰子,我们可以投掷n次,累加每次掷出的点数即可。因此要求出n个骰子的点数和,可以从n个骰子先取出一个投掷,这一个骰子只可能出现1-6中的某一个数,我们需要计算的是1-6每个点数与剩下n -1个骰子的点数和;接下来进行第二次投掷,现在骰子堆中还有n - 1个骰子,对于这n -1个骰子,继续从中选一个出来投掷,并在上次掷出的点数上累加…这显然是个递原创 2020-09-25 13:45:55 · 450 阅读 · 0 评论 -
Java详解剑指offer面试题59--队列的最大值
Java详解剑指offer面试题59–队列的最大值滑动窗口的最大值题目1:滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2, 3, 4, 2, 6, 2, 5}以及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}方法1:基于最大堆的优先队列就以题目中的例子来模拟找出窗口中的最大值的过程。先存入3个元素,于是优先队列中有{2, 3, 4},使用peek方法可以以O(1)的时间得到最大值,之后删除队列头的元原创 2020-09-25 08:37:51 · 306 阅读 · 0 评论 -
Java详解剑指offer面试题57--和为s的数字
Java详解剑指offer面试题57–和为s的数字题目1输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们的和正好是S;如果有多对数字的和等于S,输出两个数的乘积最小的。先看这个条件:和一样,要求乘积最小。由于数组递增排序,那么这两个数与其他和为s的两个数比,相隔的距离更远。这里就不证明了,试想周长一样的两个图形,又扁又长的矩形和正方形比哪个面积大吧…要从数组中找两个数相加,如果和刚好为s,这样就找到了一组候选值;如果和小于s呢,可以把两个数中较小者丢弃,换一个比它稍大的继续求和与原创 2020-09-24 12:30:44 · 257 阅读 · 0 评论 -
Java详解剑指offer面试题56--数组中数字出现的次数
Java详解剑指offer面试题56–数组中数字出现的次数一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1).例如输入数组{2, 4, 3, 6, 3, 2, 5, 5},只有4和6这两个数字只出现了一次,其他数字都出现了两次,因此输出4和6。如果不考虑空间,用哈希表统计频率倒是很简单…好吧,没有思路。书中使用的是位运算。先考虑简单的情况,如果数组中只有一个数字出现了一次而其他数都出现了两次。那么堆数组中原创 2020-09-24 08:41:59 · 327 阅读 · 0 评论 -
Java详解剑指offer面试题55--二叉树的深度
Java详解剑指offer面试题55–二叉树的深度输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。递归版本很容易想到使用递归,根结点处的深度为1,既然要求树的最长路径,必然从根结点的左右子树中选出深度更大的那棵子树,也就是整棵树的深度为depth(root)=max[depth(root.left),depth(root.right)]+1depth(root) = max[depth(root.left), depth(原创 2020-09-23 20:12:51 · 272 阅读 · 0 评论 -
Java详解剑指offer面试题54--二叉搜索树中排名为k的结点
Java详解剑指offer面试题54–二叉搜索树中排名为k的结点给定一颗二叉搜索树,请找出排名第k的结点。注意是二叉搜索树,这说明对于任何结点,有父结点大于其左子结点且小于右子结点。如果中序遍历这棵树,就能得到递增排序的序列。接下来就很简单了,只需中序遍历到第k个结点,然后立即返回就行了。感觉对于这道题,非递归的中序遍历更好写一点。package Chap6;import java.util.LinkedList;public class KthNode { public Tre原创 2020-09-23 16:13:25 · 267 阅读 · 0 评论 -
Java详解剑指offer面试题53--数组中的逆序对
Java详解剑指offer面试题53–数组中的逆序对在数组中的两个数字,如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数.暴力法很直观,拿第一个数和之后的每个数比较,然后拿第二个数和之后的每个数比较…需要两个for循环可得到结果,时间复杂度为O(n2)O(n^2)O(n2)用数组的归并过程来分析这道题,归并排序就是自上而下地将数组分割成左右两半子数组,然后递归地将子数组不断分割下去,最后子数组的大小为1,对于大小为1的子数组没有排序和归并的必原创 2020-09-23 11:43:54 · 294 阅读 · 0 评论 -
Java详解剑指offer面试题52--两个链表的第一个公共结点
Java详解剑指offer面试题 52–两个链表的第一个公共结点输入两个单链表,找出它们的第一个公共结点。这道题有一个隐含条件:单链表只有一个next指针,如果两个链表有公共结点,那么从第一个公共结点前的一个结点开始,两个链表的next都指向同一个结点了。通俗点说就是两条路汇聚成了一条。两个链表,逆序比较比如一条链表{1, 5, 6, 7, 8}另外一条{2, 3, 4, 5, 6, 7, 8}从结点5开始后面的结点都完全一样了。既然后面的结点完全一样,我们可以从后往前比较两个链表当遇到某两个原创 2020-09-23 08:51:35 · 310 阅读 · 0 评论 -
Java详解剑指offer面试题51--在排序数组中查找数字
Java详解剑指offer面试题51–在排序数组中查找数字统计一个数字在排序数组中出现的次数。遍历这是很容易想到的方法了,但时间复杂度O(n),不推荐。package Chap6;public class NumOfK { /** * 方法一:遍历,O(n)复杂度,不推荐 */ public int getNumberOfK(int[] array, int k) { if (array == null) return 0;原创 2020-09-22 19:58:42 · 371 阅读 · 0 评论 -
Java详解剑指offer面试题50--第一个只出现一次的字符
Java详解剑指offer面试题50–第一个只出现一次的字符找出字符串中找出第一个只出现一次的字符,比如输入“abacceff",则输出'b'要想知道某个字符是不是只出现了一次,必须遍历字符串的每个字符。**因此可以先遍历一次,统计每个字符出现次数。再遍历一次,遇到某个字符出现字符为1就立即返回。**统计每个字符出现次数,可以用哈希表,不过如果输入中都是ASCII码,那么使用0-255表示即可。这样使用一个int[] count = new int[256]就能代替哈希表了,以count[some原创 2020-09-22 16:36:07 · 345 阅读 · 0 评论 -
Java详解剑指offer面试题49--丑数
Java详解剑指offer面试题49–丑数把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。穷举法,挨个判断是否是丑数,即使那个数不是丑数也要判断,显然时间复杂度太高。有没有方法每一步计算只是得到丑数呢?根据丑数的定义,所有丑数都是2、3、5这三个因子的任意搭配的任意多次乘积,比如2x2,2x3, 2x2x3x5等等。那么从1开始,分别乘以2、3、5,得到2、3、5三个丑原创 2020-09-22 08:46:49 · 224 阅读 · 0 评论 -
Java详解剑指offer面试题48--最长不含重复字符串的子字符串
Java详解剑指offer面试题48–最长不含重复字符串的子字符串请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。假设字符串中只包含'a'~'z'之间的字符,例如在字符串"arabcacfr"中,最长的不含重复字符的子字符串是"acfr",长度为4动态规划,定义f(i)f(i)f(i)表示以第i个字符为结尾的不含重复字符的子字符串长度。如果第i个字符之前没有出现过,则f(i)=f(i−1)+1f(i) = f(i -1) +1f(i)=f(i−1)+1,比如‘abc原创 2020-09-21 20:28:37 · 285 阅读 · 0 评论 -
Java详解剑指offer面试题47--礼物的最大价值
Java详解剑指offer面试题47–礼物的最大价值在一个mxn的棋盘的每一格斗放油一个礼物,每个礼物都有一定的价值(大于0)从棋盘的左上角开始,每次可以往右边或者下边移动一格,知道到达棋盘的右下角。给定一个棋盘和上面的礼物,计算我们最多可以拿到多少价值的礼物递归–两个方向的深度优先搜索我第一想到的是递归,然后被书上打脸。不管,还是实现一下吧。package Chap5;public class MaxGiftVal { /** * 方法一:递归,两个方向的深度优先搜索,原创 2020-09-21 11:41:14 · 366 阅读 · 0 评论 -
Java详解剑指offer面试题45--把数组排成最小的数
Java详解剑指offer面试题45–把数组排成最小的数输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。例如输入数组{3,32,321},则打印出这三个数字能排成的最小数字为321323。这道题可以对数组排序,比如对于普通的数组{23, 12, 32},可能会想到按照自然序排序后,得到{12, 23, 32}然后直接拼接起来就得到了最小的数字122332,但是像题中的例子按照自然序排好后就是{3, 32, 321},如果直接拼接得到332321,是不是最原创 2020-09-20 17:14:15 · 283 阅读 · 0 评论 -
Java详解剑指offer面试题42--连续子数组的最大和
Java详解剑指offer面试题42–连续子数组的最大和 输入一个整型数组,数组里正负数都可能有,数组中的一个或者连续的多个整数组成一个子数组。求所有子数组的和的最大值,要求时间复杂度为O(n)枚举所有的子数组,从中选择最大和可能是很容易想到的办法了,但是总共有n(n+1)/2n(n+1) /2n(n+1)/2个子数组,最快也需要O(n2)O(n^2)O(n2)时间复杂度,Pass。我们可以举例分析数组的特点比如{1, -2, 3, 10, -4, 7, 2, -5}。首先记录下第一个元素,先假原创 2020-09-19 14:59:44 · 262 阅读 · 0 评论 -
Java详解剑指offer面试题39--数组中出现次数超过一半的数字
Java详解剑指offer面试题39–数组中出现次数超过一半的数字数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现了5次,超过数组长度的一半,因此输出2。如果不存在则输出0。可以先将数组排序,然后统计数字出现的次数,先将第一个数字出现次数初始化为1,如果遇到同样的数字,就加1,遇到不一样的就重新初始化为1重新开始计数,知道某个数字计数值大于n / 2(n是数组的长度),终止循环,返回当前数字就是我原创 2020-09-18 15:08:29 · 253 阅读 · 0 评论 -
Java详解剑指offer面试题38--字符串的排列
Java详解剑指offer面试题38–字符串的排列输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。注意这道题求得是全排列。求若干字符组成的序列的所有排列可能,可以将字符序列分解成两部分:第一个字符第一个字符之后的字符序列这样就把一个大问题分解成了小问题,然后对小问题继续采用相同的策略即可!因为所有字符都可能处于第一个位置,我们可以把第一个字符和其后的所有字符交换原创 2020-09-18 08:49:33 · 447 阅读 · 0 评论 -
Java详解剑指offer面试题37--序列化二叉树
Java详解剑指offer面试题37–序列化二叉树请实现两个函数,分别用来序列化和反序列化二叉树。刚开始想法太死板了,只记得中序和前序或者中序和后续两个序列才能决定一棵唯一的二叉树,于是分别进行了前序、中序遍历,前序和中序的序列用"|"分隔,之后再根据这个分隔符分成前序和中序序列,最后采用面试题7——重建二叉树的思路进行反序列化。思路是正确的但是太麻烦。其实遇到空指针可以也用一个特殊的字符表示,比如“#”,这样前序遍历序列就可以表示唯一的一棵二叉树了。对于空指针也用一个字符表示,可称这样的序列为扩原创 2020-09-17 08:39:24 · 241 阅读 · 0 评论 -
Java详解剑指offer面试题36--二叉搜索树与双向链表
Java详解剑指offer面试题36–二叉搜索树与双向链表输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。看到这道题我第一反映就是,二叉树的线索化,不过还是有些区别的,下面会讨论。按照二叉搜索树的特点,最左边的结点是值最小的,而题目要求得到排序的双向链表,所以基本确定下来中序遍历的方法。二叉树的线索化:是针对每个叶则结点,为了将空指针利用起来,可以将叶子结点的左子结点指向其遍历顺序的前驱,右子结点指向遍历序列的后继。根据遍历顺序的原创 2020-09-16 10:57:13 · 250 阅读 · 0 评论 -
Java详解剑指offer面试题35--复杂链表的复制
Java详解剑指offer面试题35–复杂链表的复制输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)复杂链表的定义如下private class RandomListNode { int label; RandomListNode next = null; RandomListNode random = null;原创 2020-09-15 16:52:28 · 240 阅读 · 0 评论 -
Java详解剑指offer面试题34--二叉树中和为某一值的路径
Java详解剑指off面试题34–二叉树中和为某一值的路径输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。很自然的想法是每条路径都和目标值比较,如果相同就将这条路径存入一个集合中,本质上是个深度优先搜索。路径可以用一个列表表示,因为满足要求的路径首先要是从根结点到叶子结点的一个结点序列,而只有前序遍历能先存入根结点。使用前序遍历,每访问一个结点随即就存入到当前路径中,直到访问并存入叶子结点后,将当前路径中原创 2020-09-14 19:02:21 · 244 阅读 · 0 评论 -
Java详解剑指offer面试题33--二叉搜索树的后序遍历序列
Java详解剑指offer面试题33–二叉搜索树的后序遍历序列输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。注意是二叉搜索(查找)树,特点是父结点的左子树都比父结点小,父结点的右子树都比父结点大。因此其后序遍历的序列有一定的规律:序列最后一位必然是树的根结点;序列前部分是根结点的左子树,后部分是根结点的右子树;具体来说:将序列各个元素和和序列最后一位的根结点比较,序列前部分都小于根结点的值,这部分子序原创 2020-09-14 14:13:23 · 204 阅读 · 0 评论 -
Java详解剑指offer面试题32--从上到下打印二叉树
Java详解剑指offer面试题32–从上到下打印二叉树不分行,从上往下打印出二叉树的每个节点,同层节点从左至右打印。即层序遍历不分行,层序遍历二叉树的层序遍历其实就是广度优先搜索的简单版。使用队列实现。package Chap4;import java.util.ArrayList;import java.util.LinkedList;import java.util.Queue;public class BinaryTreeLevelOrder { private c原创 2020-09-14 08:05:00 · 253 阅读 · 0 评论 -
Java详解剑指offer面试题31--栈的压入、弹出序列
Java详解剑指offer面试题31–栈的压入、弹出序列输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列(注意:这两个序列的长度是相等的)题目只是给出了两个序列,并没有栈,所有我们需要自己定义一个辅助栈帮助我们模拟入栈出栈过程。需要用到一个指针表示在出栈序列中的当前出栈元素。每次入栈原创 2020-09-13 20:46:07 · 266 阅读 · 0 评论 -
Java详解剑指offer面试题30--包含min方法的栈
Java详解剑指offer面试题30–包含min方法的栈定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数。要求push、pop、min方法的时间复杂度都为O(1)有些很容易想到的方法:比如每次想获得栈中的最小元素,将栈中所有元素复制到另一个数据结构中(比如List),然后对这个列表排序可以很简单地得到最小值。但时间复杂度肯定就不是O(1)了。或者设置一个全局变量min,每次push都和当前最小值比较,如果更小就更新min,否则min不变。但是这种方法有个问题:要是pop出栈的原创 2020-09-13 16:13:20 · 231 阅读 · 0 评论 -
Java详解剑指offer面试题28--二叉树的镜像
Java详解剑指offer面试题28–二叉树的镜像操作给定的二叉树,将其变换为原二叉树的镜像。思路很简单:从根结点开始,先交换根结点的左右子结点(子树),之后再对子结点进行同样的操作,一直往下直到树的叶子结点。叶子结点没有左右子结点,所以到这里停止交换。前序遍历的递归版本二叉树的前序前序遍历可以实现上述思路。public class MirrorTree { private class TreeNode { int val = 0; TreeNode原创 2020-09-12 09:40:52 · 190 阅读 · 0 评论 -
Java详解剑指offer面试题26--树的子结构
Java详解剑指offer面试题26–树的子结构输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)二叉树这种递归的数据结构。想到用递归的方法解决是很自然的。首先我们要在二树A中找到和树B根结点值一样的结点R,结点R可能有多个,因为树A中的结点值可能不止一个与树B的根结点值相同。对于每个结点R,其子树都有可能是树A的子结构,因此只要还未在树A中找到一个子结构,就要继续遍历树A判断其他R结点。对于某一个R结点,我们要求根结点R的左子结点、右子结点和树B根结点原创 2020-09-11 15:57:29 · 213 阅读 · 0 评论 -
Java详解剑指offer面试题25--合并两个有序链表
Java详解剑指offer面试题25–合并两个有序链表输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。第一想到的就是归并排序了。非递归版本设置两个指针,p1指向链表1的头结点,p2指向链表2的头结点。先选出归并后链表的头结点:比较两个有序链表的头结点,哪个小即将其作为归并后链表的头结点并将相应的指针右移一步。接下来不断从两个链表中取较小值的结点插入到归并链表的末尾,分四种情况:链表1被取完了,直接将整条链表2插入到归并链表的末尾,归并结束;链表原创 2020-09-11 09:39:17 · 247 阅读 · 0 评论 -
Java详解剑指offer面试题23--链表中环的入口结点
Java详解剑指offer面试题23–链表中环的入口结点一个链表中包含环,请找出该链表的环的入口结点。双指针法如下图,Y是环的入口结点,X是链表头结点。X、Y之间的步数为a。假设按照a -> b -> c ->b -> c…的顺序走。pFast走两步的同时pSlow走一步,最后他们一定会相遇。为什么一定会相遇?试想操场跑步,你跑得快就能超出跑得慢的同学好多圈;同样地如果链表有环,pFast一定会和pSlow的距离逐渐缩小,直到相遇。(最好画画图加深理解)假设pFast原创 2020-09-10 17:50:14 · 211 阅读 · 0 评论 -
Java详解剑指offer面试题22--链表中倒数第k个结点
Java详解剑指offer面试题22–链表中倒数第k个结点输入一个链表,输出该链表中倒数第k个结点。设置两个指针a、b,若当a指针到链表末尾时,b指针正好指向倒数第k个结点,此时返回指针b处的结点即可,这时a指针的位置减去b指针的位置等于k-1,如果将两个指针同步地倒退到链表头结点处,b指针会位于位置0处的头结点,而a指针位于位置k-1处的结点。所以如果我们反过来思考:一开始先让a指针走k-1步,b不动,之后两个指针同时移动,直到a到了链表末尾,此时返回b指针处的结点就是倒数第k个结点。**这种方原创 2020-09-10 14:00:24 · 239 阅读 · 0 评论 -
Java详解剑指offer面试题21--调整数组的顺序使奇数位于偶数前面
Java详解剑指offer面试题21–调整数组的顺序使奇数位于偶数前面输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。如果可以使用额外的空间,这道题不难。O(n)的空间和O(n)的时间复杂度。思路很简单:第一次遍历,将奇数存入辅助数组中;第二次遍历,将偶数存入数组中;辅助数组的元素覆盖原数组。package Chap3;import java.util.Arr原创 2020-09-10 08:58:32 · 266 阅读 · 0 评论 -
Java详解剑指offer面试题19--正则表达式匹配
Java详解剑指offer面试题19–正则表达式匹配请实现一个函数用来匹配包括'.'和'*'的正则表达式。模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次)。在本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串"aaa"与模式"a.a"和"ab*ac*a"匹配,但是与"aa.a"和"ab*a"均不匹配注意.就是一个字符,而*前面必须有一个字符(可以是.)才有意义,所以可以将x*看成一个整体,其中x表示任意字符。*在匹配时有两种情况,第二个字符是*或者不是原创 2020-09-09 14:18:25 · 405 阅读 · 0 评论 -
Java详解剑指offer面试题18--删除链表的结点
Java详解剑指offer面试题18——删除链表的结点题目一——O(1)删除链表结点给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间内删除该结点。假设要删除的结点确实在链表中。常规思路:删除某个结点需要找到该结点的前一个结点,由于单向链表没有指向前一个结点的指针,所以不得不从头指针开始遍历链表。显然时间复杂度为O(n)。实现如下:package Chap3;public class DeleteNode { private class Node {原创 2020-09-09 08:26:22 · 258 阅读 · 0 评论 -
Java详解剑指offer面试题16--数值的整数次方
Java详解剑指offer面试题16–数值的整数次方给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。不得使用库函数直接实现,无需考虑大数问题。连乘下面是我写的蹩脚程序,注意要考虑次幂为负数的情况。由于负次幂等于base的正次幂的倒数,所以取绝对值直接计算正次幂的情况就行,最后再根据exponent是否为负决定取不取倒数。当base为0时候,结果和次幂无关(都为0,假设0的非正数次幂都为0,因为它们在数学中并没有定义),所以把base原创 2020-09-08 18:26:53 · 248 阅读 · 0 评论 -
Java详解剑指offer面试题15--二进制中1的个数
Java详解剑指offer面试题15–二进制中1的个数输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。容易想到的思路:该数的各位不断和1相与,然后将该数右移1位,直到所有位都比较过。public int numberOf1_2(int n) { int count = 0; while (n != 0) { if ((n & 1) == 1) { count++; } n = n >> 1; }原创 2020-09-08 11:12:38 · 265 阅读 · 0 评论 -
Java详解剑指offer面试题14--剪绳子
Java详解剑指offer面试题14–剪绳子给你一根长度为n的绳子,把绳子剪成m段(m、n都是整数且m > 1, n > 1),m段绳子的长度依然是整数,求m段绳子的长度乘积最大为多少?比如绳子长度为8,我们可以分成2段、3段、4段...8段,只有分成3段且长度分别是2、3、3时能得到最大乘积18动态规划版本要求大问题的最优解,可以将大问题分解成小问题,分解的小问题也有最优解,因此将小问题的最优解组合起来就能得到大问题的最优解。若将f(n)定义为将长度为n的绳子分成若干段后的各段长度原创 2020-09-08 08:14:59 · 275 阅读 · 0 评论 -
Java详解剑指offer面试题13--机器人的运动范围
Java详解剑指offer面试题13–机器人的运动范围地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7 = 18。但是,它不能进入方格(35,38),因为3+5+3+8 = 19。请问该机器人能够达到多少个格子?此题和面试题12——矩阵中的路径有相似之处,依然是回溯法。每来到一个新的且满足条件的格子时,计数加1。除原创 2020-09-07 21:15:06 · 227 阅读 · 0 评论 -
Java详解剑指offer面试题12--矩阵中的路径
Java详解剑指offer面试题12–矩阵中的路径请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如下面矩阵a b t g c f c s j d e h包含一条字符串"bfce"的路径,但是矩阵中不包含"abfb"路径,因为字符串的第一个字符b占据了矩阵中的第一行第二个格子之后,路径不能再次进入该格子。原创 2020-09-07 17:14:44 · 170 阅读 · 0 评论