![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
剑指offer
wkays
这个作者很懒,什么都没留下…
展开
-
《剑指offer》面试题48:最长不含重复字符的子字符串
题目:输入一个字符串(只包含a~z的字符),求其最长不含重复字符的子字符串的长度。例如对于arabcacfr,最长不含重复字符的子字符串为acfr,长度为4。思路:使用动态规划,记录当前字符之前的最长非重复子字符串长度f(i-1),其中i为当前字符的位置。每次遍历当前字符时,分两种情况:1)若当前字符第一次出现,则最长非重复子字符串长度f(i) = f(i-1)+1。2)若当前字符不是第...转载 2019-01-17 19:58:38 · 449 阅读 · 0 评论 -
《剑指offer》面试题54:二叉搜索树的第K大节点
题目:找出二叉搜索树的第k大节点。例如,在下图的树里,第3大节点的值为4,输入该树的根节点,3,则输出4。 5 / \ 3 7 / \ / \ 2 4 6 8思路:二叉搜索树的中序遍历是有序的。可以引入一个计数器,每访问一个节点,计数器+1,当计数器等于k时,被访问节点就是该二叉搜索树的第k大节点。基于以上思路,ja...转载 2019-02-15 17:18:55 · 244 阅读 · 0 评论 -
《剑指offer》面试题58:翻转字符串
题目一:翻转单词顺序输入一个英文句子,翻转单词顺序,单词内字符不翻转,标点符号和普通字母一样处理。例如输入输入“I am a student.”,则输出“student. a am I”。思路:首先字符串整体翻转,得到“.tneduts a ma I”;然后以空格作为分隔符进行切分,对于切分下来的每一部分再进行翻转,得到“student. a am I”。基于以上思路,java参考代码如...转载 2019-02-21 16:46:34 · 204 阅读 · 0 评论 -
《剑指offer》面试题55:二叉树的深度
题目一:二叉树的深度输入一棵二叉树的根节点,求该树的深度。从根节点到叶节点一次经过的节点(含根、叶节点)形成树的一条路径,最长路径的长度为树的深度。思路:1.二叉树root的深度比其子树root.left与root.right的深度的最大值大1。因此可以通过上述结论递归求解。2. 非递归方法,而是采用广度优先/层序遍历求解。基于以上思路,java参考代码如下://树节点声明publ...转载 2019-02-16 16:50:17 · 337 阅读 · 0 评论 -
《剑指offer》面试题55(2)
题目:平衡二叉树输入二叉树的根节点,判断该树是否是平衡二叉树。如果某二叉树的任意节点的左右子树深度之差不超过1,则该树是平衡二叉树。思路1:依据平衡二叉树的定义解决。借助于上一题二叉树的深度,从根节点开始逐点判断树的左右子树的深度差值是否满足要求。由于此解法是从根到叶的判断,每一次获取节点有需要从当前节点遍历到叶节点,因此需要多次遍历。思路2:如果用后序遍历,那么访问某一个节点时已经访...转载 2019-02-16 21:39:42 · 143 阅读 · 0 评论 -
《剑指offer》面试题58(2)
题目:左旋转字符串字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。实现一个函数完成字符串的左旋转功能。比如,输入abcdefg和数字2,输出为cdefgab。思路:1.以“abcdefg”为例,我们可以把它分为两部分。由于想把它的前两个字符移到后面,我们就把前两个字符分到第一部分,把后面的所有字符分到第二部分。我们先分别翻转这两部分,于是就得到“bagfedc”。2.接下...原创 2019-02-22 16:47:17 · 177 阅读 · 0 评论 -
《剑指offer》面试题56:数组中数字出现的次数
题目一:数组中只出现一次的两个数字一个整数数组里除了两个数字出现一次,其他数字都出现两次。请找出这两个数字。要求时间复杂度为o(n),空间复杂度为o(1)。思路:这道题可以看成“数组中只出现一次的一个数字”的延伸。如果所有数字都出现两次,只有一个数字是出现1次,那么可以通过把所有所有进行异或运算解决。因为x^x = 0。但如果有两个数字出现一次,能否转化成上述问题?依旧把所有数字异或,最...转载 2019-02-17 19:17:05 · 246 阅读 · 0 评论 -
《剑指offer》目录(Java篇)(持续更新中……)
说明:随着写的题目多了,整个博客显得有些杂乱无章,学着其他博主,建立一个目录,方便自己快速能找到相应的题目。再者,可以从这次整理中,将以前的只用C++代码写过的题目增添Java版,也是相当于再梳理一次全书。工程量还是挺大的,继续前行,哈哈。参考ryderchan的博客,将所有题目分别按照类别和《剑指offer》(第二版)题目对应的页码进行整理。按照类别顺序分析字符串类页号题目...原创 2019-02-18 11:00:00 · 565 阅读 · 0 评论 -
《剑指offer》面试题66:构建乘积数组
题目:构建乘积数组给定数组A[0,1…n-1],求B[0,1…n-1],要求B[i] = A[0]*A[1]…A[i-1]*A[i+1]…A[n-1],不能使用除法。思路:这道题给定我们一个数组,让我们返回一个新数组,对于每一个位置上的数是其他位置上数的乘积,并且限定了时间复杂度O(n),并且不让我们用除法。如果让用除法的话,那这道题就应该属于Easy,因为可以先遍历一遍数组求出所有数字之...转载 2019-02-27 19:35:08 · 193 阅读 · 0 评论 -
《剑指offer》面试题59:队列的最大值
题目:滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口的最大值。例如,输入数组{2,3,4,2,6,2,5,1}和数字3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}。思路:把可能成为最大值数字的下标放入双端队列deque,从而减少遍历次数。首先,所有在没有查看后面数字的情况下,任何一个节点都有可能成为某个状态的滑动窗口的最大值,因此,数组中任何一...转载 2019-02-23 16:52:09 · 410 阅读 · 0 评论 -
《剑指offer》面试题53:在排序数组中查找数字
题目:数字在排序数组中出现的次数统计一个数字在排序数组中出现的次数。例如,输入{1,2,3,3,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4。思路:改进运用二分查找接下来我们思考如何更好地利用二分查找算法。假设我们是统计数字k在排序数组中出现的次数。在前面的算法中时间主要消耗在如何确定重复出现的数字的第一个k和最后一个k的位置上,有没有可能用二分查找算法直接找到第一个...转载 2019-02-12 20:31:26 · 186 阅读 · 0 评论 -
《剑指offer》面试题53(3)
题目:数组中数值和下标相等的元素假设一个单调递增的数组里的每个元素都是整数且是唯一的。编写一个程序,找出数组中任意一个数值等于其下标的元素。例如,输入{-3,-1,1,3,5},输出3。思路:典型的二分查找例子。根据以上思路,java参考代码如下:public class IntegerIdenticalToIndex { public static int getNumber...转载 2019-02-14 16:36:59 · 154 阅读 · 0 评论 -
《剑指offer》面试题52:两个链表的第一个公共节点
题目:输入两个单链表,找出它们的第一个公共节点。以下图为例,对一个公共节点为6所在的节点。例子如下:1 -> 2 -> 3 -> 6 -> 7 4 -> 5 ↗思路:思路一:具体算法为:分别遍历两个链表,得到分别对应的长度。然后求长度的差值,把较长的那个链表向后移动这个差值的个数,然后转载 2019-01-22 20:25:02 · 168 阅读 · 0 评论 -
《剑指offer》面试题44:数字序列中某一位的数字
题目:数字以0123456789101112131415…的格式序列化到一个字符序列中。在这个序列中,第5位(从0开始计数,即从第0位开始)是5,第13位是1,第19位是4,等等。请写一个函数,求任意第n位对应的数字。思路:我们令f(m)表示"从0~长度为m的最大的数字"的数字个数之和,由此我们可以继续分析:f(0) = 0f(1) =10 + 0 = 10 (对应0 ~ 9)f(2)...转载 2019-01-12 19:48:12 · 211 阅读 · 0 评论 -
《剑指offer》面试题49:丑数
题目: 题目:把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。 习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第N个丑数。设计一个算法,找出只含素因子2,3,5 的第 n 小的数。符合条件的数如:1, 2, 3, 4, 5, 6, 8, 9, 10, 12…思路:思路1:从1开始递增,依次判断每个数是否是丑数,不够...转载 2019-01-18 20:07:32 · 135 阅读 · 0 评论 -
《剑指offer》面试题40:最小的k个数
题目:输入n个整数,找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4。思路:1、排序把输入的n个整数排序,然后取前k个数;时间复杂度:O(nlogn)2、Partition通过partition找到第k大的数,它的左边就是前k小的数;时间复杂度:O(n)3、最大堆构建k个整数的最大堆数据结构,然后将剩余n-k个整数依次与堆...转载 2019-01-08 19:48:22 · 262 阅读 · 2 评论 -
《剑指offer》面试题50:第一个只出现一次的字符(字符串)
题目:字符串中第一个只出现一次的字符。在字符串中找出第一个只出现一次的字符。如输入abaccdeff,则输出b。思路:思路1:暴力求解,从前到后依次判断每个字符是否只出现一次,时间复杂度o(n^2),空间复杂度o(1);思路2:用空间换时间。这个思路可行的前提是题目中所说的“字符”指的是ascii编码的字符。0-127是7位ASCII码的范围,是国际标准。128-255称为扩展ASCII码...转载 2019-01-19 21:31:11 · 499 阅读 · 0 评论 -
《剑指offer》面试题45:把数组排成最小的数
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,使其为所有可能的拼接结果中最小的一个。例如输入{3,32,321},则输入321323。思路:1.此题需要对数组进行排序,关键点在于排序的规则需要重新定义。我们重新定义“大于”,“小于”,“等于”。如果a,b组成的数字ab的值大于ba,则称a"大于"b,小于与等于类似。2.比如3与32,因为332大于323,因此我们称3“大于”...转载 2019-01-14 20:58:52 · 239 阅读 · 0 评论 -
《剑指offer》面试题50:第一个只出现一次的字符(字符流)
题目:找出字符流中第一个只出现一次的字符。例如,当从字符流google中只读出前两个字符go时,第一个只出现一次的字符是g;当读完google时,第一个只出现一次的字符是l。思路:此题的关键在于“字符流”。因此最好能够记住在哪个位置出现了哪个字符,从而可以完成每读到一个字符,就能动态更新到目前为止第一个出现一次的字符。此题同样使用了长度为256的int数组作为哈希表,用字符的ascii码值作...转载 2019-01-20 20:03:22 · 127 阅读 · 0 评论 -
《剑指offer》面试题41:数据流中的中位数
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。思路:1.考虑用最大堆和最小堆实现。为了实现平均分配,可以在数据的总数目是偶数是把新数据插入最小堆,否则插入最大堆。2.还要保证最大堆中的所有数据都要小于最小堆中的数据。可以先按照奇偶规则插入,再适当...转载 2019-01-09 20:16:36 · 208 阅读 · 1 评论 -
《剑指offer》面试题46:把数字翻译成字符串
题目:给定一个数字,按照如下规则翻译成字符串:0翻译成“a”,1翻译成“b”…25翻译成“z”。一个数字有多种翻译可能,例如12258一共有5种,分别是bccfi,bwfi,bczi,mcfi,mzi。实现一个函数,用来计算一个数字有多少种不同的翻译方法。思路:下面我们从自上而下和自下而上两种角度分析这道题目,以12258为例:自上而下,从最大的问题开始,递归 : ...转载 2019-01-15 20:02:07 · 323 阅读 · 0 评论 -
《剑指offer》面试题51:数组中的逆序对
题目:如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对总数。例如输入{7,5,6,4},一共有5个逆序对,分别是(7,6),(7,5),(7,4),(6,4),(5,4)。思路:思路1:暴力解决。顺序扫描数组,对于每个元素,与它后面的数字进行比较,因此这种思路的时间复杂度为o(n^2)。思路2:上述思路在进行比较后,并没有将相关信息留下,其...转载 2019-01-21 20:03:51 · 181 阅读 · 0 评论 -
《剑指offer》面试题47:礼物的最大价值
题目:在一个m*n的棋盘的每一个格都放有一个礼物,每个礼物都有一定价值(大于0)。从左上角开始拿礼物,每次向右或向下移动一格,直到右下角结束。给定一个棋盘,求拿到礼物的最大价值。例如,对于如下棋盘1 10 3 812 2 9 65 7 4 113 7 16 5礼物的最大价值为1+12+5+7+7+16+5=53。思...原创 2019-01-16 20:46:13 · 452 阅读 · 0 评论 -
《剑指offer》面试题56(2):
题目:数组中唯一只出现一次的数字在一个整数数组中除了一个数字只出现一次外,其他数字都出现三次。找出那个出现一次的数字。思路:如果题目中的“三次”换成“两次”,这道题目将非常简单,因此两个相同的数字异或,每一位都会变成0,其实亦或也可以看成两个数字的每一个二进制位对应进行加法后对2取模后的结果。按照这种思路,对于出现三次的数字,改成对3取模即可。举个例子说明下(10,4,5,5,4,4,5)...原创 2019-02-18 16:39:51 · 132 阅读 · 0 评论 -
《剑指offer》面试题59(2)
题目:队列的最大值定义一个队列并实现函数max得到队列里的最大值。要求max,pushBack,popFront的时间复杂度都是o(1)。思路:将上一题的滑动窗口看成一个队列即可。入队时间复杂度o(1),出队时间复杂度o(1),调整记录下标的双端队列的时间复杂度最差为o(n),获取最值得时间复杂度为o(1)。基于以上思路,java参考代码如下:import java.util.Arra...转载 2019-02-24 16:24:52 · 479 阅读 · 0 评论 -
总结:各种排序算法
快速排序:package chapter2;public class P79_quickSort { public static void quicksort(int[] data){ sort(data,0,data.length-1); } public static void sort(int[] data,int left,int right)...原创 2019-04-29 20:09:25 · 131 阅读 · 0 评论 -
总结:动态规划部分
动态规划是面试中的热门话题,值得总结。原创 2019-05-05 21:13:17 · 206 阅读 · 0 评论 -
总结:堆结构
堆结构非常重要。因此特别记录一下有关堆结构的知识点。原创 2019-05-19 15:43:01 · 678 阅读 · 0 评论 -
总结:位运算
位运算也是一个不容忽视的部分。在《剑指offer》99页,提到进制,而且有一个例子:在微软产品Excel中,用A表示第1列,B表示第2列,……,Z表示26列,AA表示27列,AB表示28列……依次类推。请写出一个函数,输入用字母表示的列号编码,输出它是第几列。自己想了一下,java实现代码如下:package chapter2;public class P99_ExcelNumber ...原创 2019-05-20 21:17:03 · 138 阅读 · 0 评论 -
《剑指offer》面试题64:求1+2+……+n
题目要求:求1+2+…+n,要求不能使用乘除法,for,while,if,else,switch,case等关键词及条件判断语句?:。解题思路:不能用循环,那么可以使用递归调用求和。但又不能使用if,结束条件如何生效?可以使用如下形式替代if语句替代if的一种方式:boolean b=判断条件&&(t=递归执行语句)>0基于以上分析,java参考代码如下:pac...转载 2019-05-10 21:25:43 · 119 阅读 · 0 评论 -
《剑指offer》面试题61:扑克牌中的顺子
从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。其中A为1,J为11,Q为12,K为13,而大小王为0,且大小王能够当做任意一张牌。思路:1.首先应该对数组进行排序。2.统计数组中大小王(0)出现的个数。3.统计数组中所有相邻数之间的间隔。4.同时还需要排除对子的情况,如果出现了对子,那么肯定不可能是顺子(0除外)。5.最后比较0的个数和间隔大小,如果0的个数大于等...原创 2019-05-21 21:26:20 · 462 阅读 · 0 评论 -
总结:栈和队列相关
栈和队列相关总结。原创 2019-05-16 19:28:41 · 147 阅读 · 0 评论 -
总结:链表相关算法
《剑指offer》56页说道,链表应该是面试时被提及最频繁的数据结构,由此可见其重要性。本文将结合书中的题目,以及LeetCode中相关的题目,总结链表。...原创 2019-05-12 20:02:54 · 210 阅读 · 0 评论 -
总结:字符串经典算法
字符串的经典算法。原创 2019-05-22 17:06:35 · 1942 阅读 · 0 评论 -
《剑指offer》面试题62:圆圈中最后剩下的数字
题目:0,1,2…n-1这n个数字拍成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字,求剩下的最后一个数字。例如0,1,2,3,4这5个数字组成的圈,每次删除第3个数字,一次删除2,0,4,1,因此最后剩下的是3。思路:最直接的思路是用环形链表模拟圆圈,通过模拟删除过程,可以得到最后剩下的数字,那么这道题目就变成了删除链表中某一个节点。假设总节点数为n,删除一个节点需要走m步,那么这种...转载 2019-05-23 20:17:02 · 224 阅读 · 0 评论 -
总结:各种查找方法
查找包括顺序查找、二分查找、哈希表查找和二叉排序树查找。这里将全部用java代码实现。在这里插入代码片原创 2019-04-24 19:35:03 · 528 阅读 · 0 评论 -
《剑指offer》面试题65:不用加减乘除做加法
题目:不用加减乘除做加法写一个函数,求两个正数之和,要求在函数体内不能使用四则运算符号。思路:不能用四则运算,那只能通过位运算了。其实四则运算是针对十进制,位运算是针对二进制,都能用于运算。下面以0011(即3)与0101(即5)相加为例说明1.两数进行异或: 0011^0101=0110 这个数字其实是把原数中不需进位的二进制位进行了组合2.两数进行与: 0011&01...转载 2019-04-15 18:46:51 · 240 阅读 · 0 评论 -
《剑指offer》面试题53(2)
题目:0~n中缺失的数字一个长度为n的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0 ~ n之内。在范围0~n内的n个数字有且只有一个数字不在该数组中,请找出。思路:用二分法找到数组中第一个数值不等于下标的数字。如果中间元素的值和下标相等,那么下一轮查找只需要查找右半边;如果中间元素的值和下标不相等,并且它前面一个元素和它的下标相等,这意味着这个中间的数字正好是第一个值和下标不...转载 2019-02-13 19:40:20 · 249 阅读 · 0 评论 -
《剑指offer》面试题67:把字符串转换成整数
题目:把字符串转换成整数思路:此题比较麻烦的点是特殊情况较多,需要考虑完全。1.如果字符串前后有空格,要去除;2.如果是空串或null,要特殊处理;3.如果头部有多个正负号,要特殊处理;4.如果数值超出int的范围,要特殊处理;比int的最大值还要大,已经上溢,这肯定不能通过数字的大小比较,所以需要在字符串的状态下判断是否上溢或下溢。5.遇到非数字的字符,则转换停止;刚刚发现一个...转载 2019-02-28 17:07:33 · 278 阅读 · 0 评论 -
《剑指offer》面试题57:和为s的数字
题目:和为s的数字输入一个递增排序的数组和一个数字s,在数组中查找两个数,使它们的和为s。如果有多对和为s,输入任意一对即可。思路:使用两个指针分别指向数组的头、尾。如果和大于s,头部指针后移,如果和小于s,尾部指针前移。基于以上思路,java参考代码如下:public class Test { public static int[] findNumbersWithSum(int[]...原创 2019-02-19 16:56:31 · 135 阅读 · 0 评论