剑指Offer
面试官的视角从面试官视角剖析考题构思、现场心理、题解优劣与面试心得。
Wang-Junchao
这个作者很懒,什么都没留下…
展开
-
【剑指Offer学习】【所有面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流!目录第01-10题【剑指Offer学习】【面试题02:实现Singleton 模式——七种实现方式】【剑指Offer学习】【面试题03:二维数组中的查找】【剑指Offer学习】【面试题04:替换空格】【剑指O原创 2015-07-15 07:26:11 · 56403 阅读 · 11 评论 -
【剑指Offer学习】【面试题67:机器人的运动范围】
题目:地上有个m行n列的方格。一个机器人从坐标(0,0)的格子开始移动,它每一次可以向左、右、上、下移动一格,但不能进入行坐标和列坐标的数位之和大于k的格子。举例分析 例如,当k为18时,机器人能够进入方格(35,37),因为3+5+3+7=18.但它不能进入方格(35,38),因为3+5+3+8=19.请问该机器人能够达到多少格子?解题思路 和前面的【剑指Offer学习】【面试题66:矩阵中的原创 2015-07-15 07:21:40 · 7065 阅读 · 3 评论 -
【剑指Offer学习】【面试题66:矩阵中的路径】
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。举例分析 例如在下面的3*4的矩阵中包含一条字符串”bcced”的路径。但矩阵中不包含字符串“abcb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二格子之后,路径不能再原创 2015-07-15 07:10:06 · 6742 阅读 · 1 评论 -
【剑指Offer学习】【面试题65:滑动窗口的最大值】
题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。举例说明例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小,那么一共存在6个滑动窗口,它们的最大值分别为{4,4,6,6,6,5}。解题思路 如果采用蛮力法,这个问题似乎不难解决:可以扫描每一个滑动窗口的所有数字并找出其中的最大值。如果滑动窗口的大小为k,需要O(k)时间才能找出滑动窗口里的最大值。对于长度为n的输原创 2015-07-14 08:18:26 · 6602 阅读 · 2 评论 -
【剑指Offer学习】【面试题64:数据流中的中位数】
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有值排序之后位于中间的数值。如果数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路 由于数据是从一个数据流中读出来的,数据的数目随着时间的变化而增加。如果用一个数据容器来保存从流中读出来的数据,当有新的数据流中读出来时,这些数据就插入到数据容器中。这个数据容器用什么数据结构定义更合适呢原创 2015-07-14 08:05:21 · 6042 阅读 · 0 评论 -
【剑指Offer学习】【面试题63:二叉搜索树的第k个结点】
题目:给定一棵二叉搜索树,请找出其中的第k大的结点。解题思路 如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。结点定义private static class BinaryTreeNode { private int val; private BinaryTreeNode left;原创 2015-07-14 07:53:05 · 5274 阅读 · 1 评论 -
【剑指Offer学习】【面试题62:序列化二叉树】
题目:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路 通过分析解决前面的面试题6.我们知道可以从前序遍历和中序遍历构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序序列,然后再反序列化时通过这两个序列重构出原二叉树。 这个思路有两个缺点。一个缺点是该方法要求二叉树中不能用有数值重复的结点。另外只有当两个序列中所有数据都读出后才能开始反序列化。如果两原创 2015-07-13 08:25:45 · 7207 阅读 · 1 评论 -
【剑指Offer学习】【面试题61:按之字形顺序打印二叉树】
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。解题思路 按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶原创 2015-07-13 08:11:07 · 5357 阅读 · 1 评论 -
【剑指Offer学习】【面试题60:把二叉树打印出多行】
题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。解题思路 用一个队列来保存将要打印的结点。为了把二叉树的每一行单独打印到一行里,我们需要两个变量:一个变量表示在当前的层中还没有打印的结点数,另一个变量表示下一次结点的数目。结点定义private static class BinaryTreeNode { private int val; privat原创 2015-07-13 08:00:38 · 5049 阅读 · 2 评论 -
【剑指Offer学习】【面试题59:对称的二叉树】
题目:请实现一个函数来判断一棵二叉树是不是对称的。如果一棵二叉树和它的镜像一样,那么它是对称的。解题思路 通常我们有三种不同的二叉树遍历算法,即前序遍历、中序遍历和后序遍历。在这三种遍历算法中,都是先遍历左子结点再遍历右子结点。我们是否可以定义一种遍历算法,先遍历右子结点再遍历左子结点?比如我们针对前序遍历定义一种对称的遍历算法,即先遍历父节点,再遍历它的右子结点,最后遍历它的左子结点。原创 2015-07-12 07:44:44 · 3728 阅读 · 1 评论 -
【剑指Offer学习】【面试题58:二叉树的下一个结点】
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父节点的指针。解题思路 如果一个结点有右子树,那么它的下一个结点就是它的右子树中的左子结点。也就是说右子结点出发一直沿着指向左子结点的指针,我们就能找到它的下一个结点。 接着我们分析一个结点没有右子树的情形。如果结点是它父节点的左子结点,那么它的下一个结点就是原创 2015-07-12 07:30:10 · 4174 阅读 · 1 评论 -
【剑指Offer学习】【面试题57:删除链表中重复的结点】
题目:在一个排序的链表中,如何删除重复的结点?解题思路 解决这个问题的第一步是确定删除的参数。当然这个函数需要输入待删除链表的头结点。头结点可能与后面的结点重复,也就是说头结点也可能被删除,所以在链表头添加一个结点。 接下来我们从头遍历整个链表。如果当前结点的值与下一个结点的值相同,那么它们就是重复的结点,都可以被删除。为了保证删除之后的链表仍然是相连的而没有中间断开,我们要把当前的前一个结原创 2015-07-12 07:24:06 · 4678 阅读 · 1 评论 -
【剑指Offer学习】【面试题56:链表中环的入口结点】
题目:一个链表中包含环,如何找出环的入口结点?解题思路 可以用两个指针来解决这个问题。先定义两个指针P1和P2指向链表的头结点。如果链表中环有n个结点,指针P1在链表上向前移动n步,然后两个指针以相同的速度向前移动。当第二个指针指向环的入口结点时,第一个指针已经围绕着环走了一圈又回到了入口结点。 剩下的问题就是如何得到环中结点的数目。我们在面试题15的第二个相关题目时用到了一快一慢的两个指针原创 2015-07-11 06:55:45 · 4100 阅读 · 3 评论 -
【剑指Offer学习】【面试题55:字符流中第一个不重复的字符】
题目:请实现一个函数用来找出字符流中第一个只出现一次的字符。举例说明 例如,当从字符流中只读出前两个字符“go”时,第一个只出现一次的字符是‘g’。当从该字符流中读出前六个字符“google”时,第一个只出现1次的字符是”l”。解题思路 字符只能一个接着一个从字符流中读出来。可以定义一个数据容器来保存字符在字符流中的位置。当一个字符第一次从字符流中读出来时,把它在字符流中的位置保存到数据容器里。原创 2015-07-11 06:51:04 · 5009 阅读 · 0 评论 -
【剑指Offer学习】【面试题54:表示数值的字符串】
题目:请实现一个函数用来判断字符串是否表示数值(包括整数和小数)。例子说明 例如,字符串“+100”,“5e2”,“-123”,“3.1416”及”-1E-16”都表示数值,但“12e”,”1a3.14”,”1.2.3”,”+-5”及“12e+5.4”都不是。 解题思路 在数值之前可能有一个表示正负的’-‘或者’+’。接下来是若干个0到9的数位表示数值的整数部分(在某些小数里可能没有数值的原创 2015-07-10 08:14:23 · 5255 阅读 · 2 评论 -
【剑指Offer学习】【面试题53:正则表达式匹配】
题目:请实现一个函数用来匹配包含‘.’和‘*’的正则表达式。模式中的字符’.’表示任意一个字符,而‘*’表示它前面的字符可以出现任意次(含0次)。本题中,匹配是指字符串的所有字符匹配整个模式。例如,字符串“aaa”与模式“a.a”和“ab*ac*a”匹配,但与“aa.a”及“ab*a”均不匹配。题目解析 每次从字符串里拿出一个字符和模式中的字符去匹配。先来分析如何匹配一个字符。如果模式中的字符ch原创 2015-07-10 08:07:57 · 4843 阅读 · 0 评论 -
【剑指Offer学习】【面试题52:构建乘积数组】
题目:给定一个数组A[0,1,…,n-1],请构建一个数组B[0,1,…,n-1],其中B中的元素B[i]=A[0]×A[1]×…×A[i-1]×A[i+1]×…×A[n-1],不能使用除法。解题思路例如:A[]={1,2,3}求B[] B[0]=A[1]×A[2]=2×3=6 B[1]=A[0]×A[2]=1×3=3 B[2]=A[0]×A[1]=1×2=21.B[0]初始化为1,从下标i=原创 2015-07-10 07:55:41 · 4833 阅读 · 0 评论 -
【剑指Offer学习】【面试题51:数组中重复的数字】
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。举例说明 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3。题目分析:解决这个问题的一个简单的方法是先把输入的数组排序。从排序的数组中找出重复的数字时间很容易的事情,只需要从头到尾原创 2015-07-09 08:13:46 · 6446 阅读 · 1 评论 -
【剑指Offer学习】【面试题50:树中两个结点的最低公共祖先】
题目:求树中两个结点的最低公共祖先,此树不是二叉树,并且没有指向父节点的指针。我们首先得到一条从根结点到树中某一结点的路径,这就要求在遍历的时候,有一个辅助内存来保存路径.比如我们用前序遍历的方法来得到从根结点到H 的路径的过程是这样的:( 1 )遍历到A,把A 存放到路径中去,路径中只有一个结点A; ( 2 )遍历到B,把B 存到路径中去,此时路径为A->B; ( 3 )遍历到D,把D 存放到路径中去,此,时路径为原创 2015-07-09 08:07:28 · 4742 阅读 · 3 评论 -
【剑指Offer学习】【面试题49:把字符串转换成整数】
题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。题目解析 这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串”“,正负号,溢出等方方面面的测试用例都考虑原创 2015-07-09 07:47:55 · 4598 阅读 · 0 评论 -
【剑指Offer学习】【面试题47:不用加减乘除做加法】
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。解题思路 5 的二进制是101, 17 的二进制是10001 。还是试着把计算分成三步:第一步各位相加但不计进位, 得到的结果是10100 ( 最后一位两个数都是1,相加的结果是二进制的10 。这一步不计进位, 因此结果仍然是0 。第二步记下进位。在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10 。原创 2015-07-08 08:42:40 · 5034 阅读 · 0 评论 -
【剑指Offer学习】【面试题45:圆圈中最后剩下的数字(约瑟夫环问题)】
题目:0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。解题思路第一种:经典的解法, 用环形链表模拟圆圈。创建一个总共有n 个结点的环形链表,然后每次在这个链表中删除第m 个结点。第二种:分析法原创 2015-07-08 08:31:41 · 6795 阅读 · 4 评论 -
【剑指Offer学习】【面试题44:扑克牌的顺子】
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。小王可以看成任意数字。解题思路:我们可以把5张牌看成由5个数字组成的数组。大、小王是特殊的数字,我们不妨把它们都定义为0,这样就能和其他扑克牌区分开来了。 接下来我们分析怎样判断5个数字是不是连续的,最直观的方法是把数组排序。值得注意的是,由于0可以当成任。原创 2015-07-08 08:13:10 · 6926 阅读 · 2 评论 -
【剑指Offer学习】【面试题43 : n 个锻子的点数】
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s 的所有可能的值出现的概率。解题思路解法一:基于通归求解,时间效率不够高。解法二:基于循环求解,时间性能好原创 2015-07-07 08:48:28 · 3743 阅读 · 0 评论 -
【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串】
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变。为简单起见,标点符号和普通字母一样处理。举例说明例如输入字符串”I am a student. ”,则输出”student. a am I”。题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcefg"和数字2,该函数将返回左旋转2 位得到的结"cdefab"原创 2015-07-07 08:28:50 · 4514 阅读 · 0 评论 -
【剑指Offer学习】【面试题41:和为s 的两个数字vs 和为s 的连续正数序列】
题目一:输入一个递增排序的数组和一个数字s,在数组中查找两个数,得它们的和正好是s。如果有多对数字的和等于s,输出任意一对即可。举例说明例如输入数组{1 、2 、4、7 、11 、15 }和数字15. 由于4+ 11 = 15 ,因此输出4 和11 。题目二:输入一个正数s,打印出所有和为s 的连续正数序列(至少两个数)。例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以结果打出3 个连原创 2015-07-07 08:12:47 · 4148 阅读 · 0 评论 -
【剑指Offer学习】【面试题40:数组中只出现一次的数字】
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。我们想到异或运算的一个性质:任何一个数字异或它自己都等于0。也就是说, 如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。原创 2015-07-06 10:42:25 · 6113 阅读 · 2 评论 -
【剑指Offer学习】【面试题39:二叉树的深度】
题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶子点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。题目二:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1 ,那么它就是一棵平衡二叉树。原创 2015-07-06 10:31:46 · 4811 阅读 · 0 评论 -
【剑指Offer学习】【面试题38:数字在排序数组中出现的次数】
题目:统计一个数字:在排序数组中出现的次数。举例说明例如输入排序数组{ 1, 2, 3, 3, 3, 3, 4, 5}和数字3 ,由于3 在这个数组中出现了4 次,因此输出4 。解题思路 利用改进的二分算法。 如何用二分查找算法在数组中找到第一个k,二分查找算法总是先拿数组中间的数字和k作比较。如果中间的数字比k大,那么k只有可能出现在数组的前半段,下一轮我们只在数组的前半段查找就可以了。原创 2015-07-06 10:14:32 · 3738 阅读 · 1 评论 -
【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
题目:输入两个链表,找出它们的第一个公共结点。第一种:直接法第二种:使用栈第三种:先行法原创 2015-07-05 07:07:16 · 6400 阅读 · 1 评论 -
【剑指Offer学习】【面试题36:数组中的逆序对】
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路:第一种:直接求解 第二种:分析法原创 2015-07-05 06:52:31 · 15313 阅读 · 5 评论 -
【剑指Offer学习】【面试题35:第一个只出现一次的字符】
题目:在字符串中找出第一个只出现一次的字符。解题思路:第一种:直接求解:从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n^2)。第二种:记录法原创 2015-07-05 06:28:47 · 4903 阅读 · 0 评论 -
【剑指Offer学习】【面试题34:丑数】
题目:我们把只包含因子2、3 和5 的数称作丑数(Ugly Number)。求从小到大的顺序的第1500个丑数。解题思路:第一种:逐个判断每个数字是不是丑数的解法,直观但不够高效。第二种:创建数组保存已经找到丑数,用空间换时间的解法。原创 2015-07-04 08:27:16 · 4537 阅读 · 0 评论 -
【剑指Offer学习】【面试题33:把数组排成最小的数】
题目:输入一个正整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。解题思路:第一种:直观解法先求出这个数组中所有数字的全排列,然后把每个排列拼起来,最后求出拼起来的数字的最大值。第二种:排序解法找到一个排序规则,数组根据这个规则排序之后能排成一个最小的数字。原创 2015-07-04 08:10:28 · 5848 阅读 · 1 评论 -
【剑指Offer学习】【面试题32:求从1到n的整数中1出现的次数】
题目:输入一个整数n求从1 到n这n个整数的十进制表示中1 出现的次数。举例说明:例如输入12 ,从1 到12 这些整数中包含1 的数字有1、10、11 和12,1 一共出现了5 次。题解思路:一:不考虑时间效率的解法累加1到n中每个整数1 出现的次数。二:从数字规律着手明显提高时间效率原创 2015-07-04 07:58:29 · 5926 阅读 · 4 评论 -
【剑指Offer学习】【面试题31:连续子数组的最大和】
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。求所有子数组的和的最大值。要求时间复杂度为O(n)。例子说明:解题思路:解法一:举例分析数组的规律解法二: 应用动态归划法原创 2015-07-03 07:37:47 · 13576 阅读 · 1 评论 -
【剑指Offer学习】【面试题30:最小的k个数】
题目: 输入n个整数,找出其中最小的k个数。解题思路:解法一:O(n)时间算法,只有可以修改输入数组时可用。可以基于Partition函数来解决这个问题。解法二: O(nlogk)的算法,精剧适合处理海量数据。采用大顶堆来实现。原创 2015-07-03 07:13:53 · 7656 阅读 · 1 评论 -
【剑指Offer学习】【面试题29 :数组中出现次数超过一半的数字】
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字解题思路:解法一:基于Partition 函数的O(n)算法解法二:根据数组组特点找出O(n)的算法原创 2015-07-03 06:56:06 · 8161 阅读 · 2 评论 -
【剑指Offer学习】【面试题28 :字符串的排列】
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc。则打印出由字符a、b、c 所能排列出来的所有字符串abc、acb、bac 、bca、cab 和cba 。原创 2015-07-02 09:01:45 · 7087 阅读 · 5 评论 -
【剑指Offer学习】【面试题27:二叉搜索树与双向链表】
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。原创 2015-07-02 08:53:39 · 4242 阅读 · 0 评论