
Java剑指Offer
快乐李同学(李俊德-大连理工大学)
B站/微博/微信公众号:快乐李同学。
大连理工大学软件工程2020毕业学生。
大连理工大学2018-2019学年科技创新奖学金。
2个国家级项目,2个国家级奖项,5个省级奖项,8个校级奖项(总项目经费和竞赛奖金达2万2千元)。
2018-2019年在中国核心期刊《现代计算机》发表2篇项目相关论文,分别署名第一、第二作者(知网可查)。
2018-2019年申请2份项目软件著作权,并发布软件(编程乐园、编程学院)到Google,腾讯,百度,华为,小米等应用商店。
大学英语六级568分。
展开
-
Java详解剑指offer面试题68--树中两个结点的最低公共祖先
Java详解剑指offer面试题68–树中两个结点的最低公共祖先输入一棵树的两个结点,返回它们的最低公共祖先。这道题说得很含糊,仅仅告诉了*一棵树,*那这棵树是二叉树吗?再具体点,它是二叉查找树吗?我们来一一讨论这这几种情况。如果这颗树是二叉查找树二叉查找树的特点是:任意父节点都大于其左子树的所有结点值,且都小于其右子树的所有结点值。两个结点的公共祖先一定是大于其中较小的那个且小于其中较大的那个,而从根结点开始从上到下遇到的第一个位于两个输入结点值之间的结点就是最低的公共祖先。于是我们可以这么原创 2020-09-28 17:42:22 · 582 阅读 · 0 评论 -
Java详解剑指offer面试题67--把字符串转换成整数
Java详解剑指offer面试题67–字符串转整数将一个字符串转换成一个整数,要求不能使用字符串转换整数的库函数。 数值为0或者字符串不是一个合法的数值则返回0我们知道Java内置了Integer.parseInt(String s),直接调用即可。如果要自己写呢,你可能很快想出如下代码public static int str2Int { // 核心代码 int number = 0; for (int i = 0; i < s.length(); i++) {原创 2020-09-28 13:54:29 · 368 阅读 · 0 评论 -
Java详解剑指offer面试题65--不用加减乘除做加法
Java详解剑指offer面试题65–不用加减乘除做加法写一个函数,求两个整数之和,要求在函数体内不得使用"+"、"-"、“x”、"÷"四则运算符号。不能用四则运算,自然容易想到用位运算。但如何使用位运算作加法呢?先来分析十进制是如何作加法的。比如要18 + 6 1 8+ 0 6—————— 1 4+ 1 0—————— 2 41) 个位和个位相加,十位与十位相加,但不进位;2) 6 + 8产生一位进位得到10,1 + 0不产生进位;3) 不进位的和14 + 个位的进位1原创 2020-09-27 21:14:46 · 272 阅读 · 0 评论 -
Java详解剑指offer面试题64--求1+2+3+...+n
Java详解剑指offer面试题64–求1+2+3+…+n求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键词以及三元运算符等。这道题没有多大意义…方法1,递归不过该做还是得做。循环不能用,很自然想到用递归。package Chap6;public class Sum { public int Sum_Solution(int n) { if (n == 1) return 1; return原创 2020-09-27 00:13:27 · 374 阅读 · 0 评论 -
Java详解剑指offer面试题63--股票的最大利润
Java详解剑指offer面试题63–股票的最大利润假设某股票的价格按照时间先后顺序存储在数组中,问买卖该股票一次可能获得的最大利润是多少?如一支股票在某段时间内的价格为{9, 11, 8, 5, 7, 12, 16, 14}那么能在价格为5的时候购入并在价格为16时卖出,能获得最大利润11咋一看好像只要求出数组中的最大/最小值就完事了,但是数组中的值是按照时间顺序排列的,这就是说假如数组中最小值在最大值之后,它们的差值不会是股票的最大利润。因此我们要求的是数组中排在后面的数(售出价格)与排在前面原创 2020-09-26 21:06:47 · 534 阅读 · 0 评论 -
Java详解剑指offer面试题61--扑克牌中的顺子
Java详解剑指offer面试题61–扑克牌中的顺子从扑克牌中随机抽5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2~10是数字本身,A为1,J为11,Q为12,K为13,而大小王可以看成任意数字。这道题有两种思路。方法1:用大小王填补间隔正常的顺子比如23456,假如含有大小王呢?03467也能构成顺子,虽然4和6中间有一个间隔,但是因为存在一张大小王,刚好可以让它成为5而填补上4和6之间的间隔。再假设是00367也能构成顺子,3和6之间有两个间隔但是刚好有两个王可以填补。更特殊的023原创 2020-09-26 10:21:08 · 680 阅读 · 0 评论 -
Java详解剑指offer面试题46--把数字翻译成字符串
Java详解剑指offer面试题46–把数字翻译成字符串给定一个数字,我们按照如下的规则把它翻译成字符串0 -> a1 -> b2 -> c...25 -> z一个数字可能有多种翻译,比如12258有五种,分别是"bccfi", "bwfi","bczi","mcfi", "mzi".请实现一个函数,用来计算一个数字有多少种不同的翻译方法。举个简单的例子,比如258,我们可以先翻译第一个数字,得到c,也可以翻译前两个数字,得到z;如果先翻译了一个数,对于剩下的原创 2020-09-20 21:34:46 · 266 阅读 · 0 评论 -
Java详解剑指offer面试题44--数字序列中的某一位数字
Java详解剑指offer面试题44–数字序列中的某一位数字数字以0123456789101112131415....的格式序列化得到一个字符序列中,在这个序列中,第5位(从0开始计数)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字逐个列举有一种方法,每列举一个数字就记录当前序列长度和,比如列举到3,序列的长度和为4,列举到10,长度和为12…以此类推。当某次列举使得当前长度和大于给定的n时,停止列举,第n位数一定在在刚列举的数中,接下里只需从这个数中找出是哪一位即原创 2020-09-20 09:31:55 · 288 阅读 · 0 评论 -
Java详解剑指offer面试题43--1~n整数中1出现的次数
Java详解剑指offer面试题43–1~n整数中1出现的次数输入一个整数n,求1~n这n个整数的十进制表示中1出现的次数,例如输入12, 1~12中出现1的有1、10、11、12共5次计算每个数字出现1的次数比较直接的思路就是写一个方法可以统计任意整数1的个数,然后用一个循环得到对1~n每一个数调用该方法统计总的1的出现次数。package Chap5;public class NumOf1 { /** * 方法1,计算每个数字中1的个数,复杂度O(nlgn)原创 2020-09-19 23:27:38 · 270 阅读 · 0 评论 -
Java详解剑指offer面试题41--数据流中的中位数
Java详解剑指offer面试题41–数据流中的中位数如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。这道题的意思是,有一个容器不断接收到流中的数据,因此该容器的大小是动态的,找出一种方法能快速得到动态容器中的中位数。最容易想到的就是直接对容器排序,中位数就是中间的元素。但是时间复杂度为O(nlgn)太高了;使用切分算法对一个数组进行部分排序,能以O(n)的原创 2020-09-19 10:37:39 · 276 阅读 · 0 评论 -
Java详解剑指offer面试题40--最小的k个数
Java详解剑指offer面试题40–最小的k个数输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4,。切分法,时间复杂度O(n)如果做了面试题39,这道题很容易想到直接使用切分法。几乎一模一样的代码。注意k的取值范围,不能比输入数组的长度还要大,也不能为非正数。public class LeastKNums { /** * 方法1:基于快排的切分 */ public ArrayList&l原创 2020-09-18 21:09:33 · 264 阅读 · 0 评论 -
Java详解剑指offer面试题29--顺时针打印矩阵
Java详解剑指offer面试题29–顺时针打印矩阵输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字,例如,如果输入如下矩阵:1 2 3 4 5 6 7 89 10 11 1213 14 15 16 则依次打印出数字1,2,3,4,8,12,16,15,14,13,9,5,6,7,11,10.顺时针打印一个矩阵需要按照如下顺序:从左往右遍历每个数字,只需保证至少有一行即可。从上往下遍历每个数字,保证至少有两行。从右往左遍历每个数字,除了保证至少有两行,还要保证至少两原创 2020-09-13 10:33:32 · 219 阅读 · 0 评论 -
Java详解剑指offer面试题27--对称的二叉树
Java详解剑指offer面试题27–对称的二叉树请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。对称的二叉树,结点数必然是奇数,特别地定义空树也是对称的。当对称树的结点值不是完全相同时比较好处理,但是当结点值全部一样时候可能会有些麻烦。我们要实现一个通用的算法,使得对于这种特殊情况也能正确处理。要保证树是对称的,左子树最左边的结点要和右子树最右边的结点值相同…左子树的右子结点要和右子树的左子结点值相同,即root1.left ==原创 2020-09-11 20:31:23 · 196 阅读 · 0 评论 -
Java详解剑指offer面试题24--反转链表
Java详解剑指offer面试题24–反转链表输入一个链表的头结点,反转链表后,并返回反转链表的头结点。用栈实现,不推荐本题容易想到用栈,但是空间复杂度为O(N)不推荐。package Chap3;import java.util.LinkedList;/** * 输入一个链表的头结点,反转链表后,并返回反转链表的头结点。 */public class ReverseLinkedList { private class ListNode { int val原创 2020-09-10 22:42:04 · 218 阅读 · 0 评论 -
Java详解剑指offer面试题20--表示数值的字符串
Java详解剑指offer面试题20–表示数值的字符串请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例如,字符串"+100","5e2","-123","3.1416"和"-1E-16"都表示数值。但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。正则表达式这道题有点没意思,就是考虑各种情况,实际上可能还是考虑得不全。第一想到就是直接使用正则表达式。对正则不熟写起来可能要花些时间。public boolean isNumeric(char[]原创 2020-09-09 21:54:41 · 238 阅读 · 0 评论 -
Java详解剑指offer面试题17--打印从1到最大的n位十进制数
Java详解剑指offer面试题17–打印从1到最大的n位十进制数输入数字n,按顺序打印处1到最大的n位十进制数,比如输入3,则打印1~999之间的数这道题有陷阱,可能容易想到输入4就打印19999,输入5就打印199999…那我要是输入100呢?int型不能表示出来吧,甚至更大的值,即便是long型也不能表示出来。这是一道大数问题,牵涉到大数问题我们可以将其转化为字符串表示。因为字符串任意长度都行。在字符串上模拟数字的加法本题要求按照递增顺序打印出1~最大的n位十进制数,所以字符串的长度定原创 2020-09-08 23:24:40 · 297 阅读 · 0 评论 -
Java详解剑指offer面试题11--旋转数组中的最小数字
Java详解剑指offer面试题11–旋转数组中的最小数字把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。 输入一个非递减排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小值为1。 NOTE:给出的所有元素都大于0,若数组大小为0,请返回0。题目给出的是非递减排序数组,所以不是严格递增的,可能有相同元素的情况。顺序遍历我的解法:两个子数组都是递增的,只有在两个子数组的分界线处,才会有前一个字符大于后一原创 2020-09-07 00:20:19 · 256 阅读 · 0 评论 -
Java详解剑指offer面试题2-单例模式(史上最全的Java单例模式和原理解析)
Java详解剑指offer面试题2-单例模式1题目描述单例模式需要满足如下规则:构造函数私有化(private),使得不能直接通过new的方式创建实例对象;通过new在代码内部创建一个(唯一)的实例对象;定义一个public static的公有静态方法,返回上一步中创建的实例对象;由于在静态方法中,所以上一步的对象也应该是static的。2代码实现2.1饿汉模式根据这个规则,我们可以写出如下模式,这种模式又被称为饿汉模式。不管用不用得到,先new出来再说。package Chap2;原创 2020-09-04 00:27:23 · 373 阅读 · 0 评论