剑指Offer学习
Wang-Junchao
这个作者很懒,什么都没留下…
展开
-
【剑指Offer学习】【所有面试题汇总】
剑指Offer学习 剑指Offer这本书已经学习完了,从中也学习到了不少的东西,现在做一个总的目录,供自已和大家一起参考,学如逆水行舟,不进则退。只有不断地学习才能跟上时候,跟得上技术的潮流!目录第01-10题【剑指Offer学习】【面试题02:实现Singleton 模式——七种实现方式】【剑指Offer学习】【面试题03:二维数组中的查找】【剑指Offer学习】【面试题04:替换空格】【剑指O原创 2015-07-15 07:26:11 · 56397 阅读 · 11 评论 -
【剑指Offer学习】【面试题66:矩阵中的路径】
题目:请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中任意一格开始,每一步可以在矩阵中间向左、右、上、下移动一格。如果一条路径经过了矩阵的某一格,那么该路径不能再次进入该格子。举例分析 例如在下面的3*4的矩阵中包含一条字符串”bcced”的路径。但矩阵中不包含字符串“abcb”的路径,因为字符串的第一个字符b占据了矩阵中的第一行第二格子之后,路径不能再原创 2015-07-15 07:10:06 · 6740 阅读 · 1 评论 -
【剑指Offer学习】【面试题47:不用加减乘除做加法】
题目:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、×、÷四则运算符号。解题思路 5 的二进制是101, 17 的二进制是10001 。还是试着把计算分成三步:第一步各位相加但不计进位, 得到的结果是10100 ( 最后一位两个数都是1,相加的结果是二进制的10 。这一步不计进位, 因此结果仍然是0 。第二步记下进位。在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10 。原创 2015-07-08 08:42:40 · 5033 阅读 · 0 评论 -
【剑指Offer学习】【面试题64:数据流中的中位数】
题目:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有值排序之后位于中间的数值。如果数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。解题思路 由于数据是从一个数据流中读出来的,数据的数目随着时间的变化而增加。如果用一个数据容器来保存从流中读出来的数据,当有新的数据流中读出来时,这些数据就插入到数据容器中。这个数据容器用什么数据结构定义更合适呢原创 2015-07-14 08:05:21 · 6040 阅读 · 0 评论 -
【剑指Offer学习】【面试题42:翻转单词顺序vs左旋转字符串】
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字啊的顺序不变。为简单起见,标点符号和普通字母一样处理。举例说明例如输入字符串”I am a student. ”,则输出”student. a am I”。题目二:字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如输入字符串"abcefg"和数字2,该函数将返回左旋转2 位得到的结"cdefab"原创 2015-07-07 08:28:50 · 4513 阅读 · 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 · 4143 阅读 · 0 评论 -
【剑指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 · 6600 阅读 · 2 评论 -
【剑指Offer学习】【面试题40:数组中只出现一次的数字】
题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n),空间复杂度是O(1)。我们想到异或运算的一个性质:任何一个数字异或它自己都等于0。也就是说, 如果我们从头到尾依次异或数组中的每一个数字,那么最终的结果刚好是那个只出现一次的数字,因为那些成对出现两次的数字全部在异或中抵消了。原创 2015-07-06 10:42:25 · 6112 阅读 · 2 评论 -
【剑指Offer学习】【面试题39:二叉树的深度】
题目一:输入一棵二叉树的根结点,求该树的深度。从根结点到叶子点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。题目二:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1 ,那么它就是一棵平衡二叉树。原创 2015-07-06 10:31:46 · 4810 阅读 · 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 · 3736 阅读 · 1 评论 -
【剑指Offer学习】【面试题62:序列化二叉树】
题目:请实现两个函数,分别用来序列化和反序列化二叉树。解题思路 通过分析解决前面的面试题6.我们知道可以从前序遍历和中序遍历构造出一棵二叉树。受此启发,我们可以先把一棵二叉树序列化成一个前序遍历序列和一个中序序列,然后再反序列化时通过这两个序列重构出原二叉树。 这个思路有两个缺点。一个缺点是该方法要求二叉树中不能用有数值重复的结点。另外只有当两个序列中所有数据都读出后才能开始反序列化。如果两原创 2015-07-13 08:25:45 · 7206 阅读 · 1 评论 -
【剑指Offer学习】【面试题60:把二叉树打印出多行】
题目:从上到下按层打印二叉树,同一层的结点按从左到右的顺序打印,每一层打印一行。解题思路 用一个队列来保存将要打印的结点。为了把二叉树的每一行单独打印到一行里,我们需要两个变量:一个变量表示在当前的层中还没有打印的结点数,另一个变量表示下一次结点的数目。结点定义private static class BinaryTreeNode { private int val; privat原创 2015-07-13 08:00:38 · 5048 阅读 · 2 评论 -
【剑指Offer学习】【面试题61:按之字形顺序打印二叉树】
题目:请实现一个函数按照之字形顺序打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右到左的顺序打印,即第一行按照从左到右的顺序打印,第二层按照从右到左顺序打印,第三行再按照从左到右的顺序打印,其他以此类推。解题思路 按之字形顺序打印二叉树需要两个栈。我们在打印某一行结点时,把下一层的子结点保存到相应的栈里。如果当前打印的是奇数层,则先保存左子结点再保存右子结点到一个栈里;如果当前打印的是偶原创 2015-07-13 08:11:07 · 5356 阅读 · 1 评论 -
【剑指Offer学习】【面试题58:二叉树的下一个结点】
题目:给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父节点的指针。解题思路 如果一个结点有右子树,那么它的下一个结点就是它的右子树中的左子结点。也就是说右子结点出发一直沿着指向左子结点的指针,我们就能找到它的下一个结点。 接着我们分析一个结点没有右子树的情形。如果结点是它父节点的左子结点,那么它的下一个结点就是原创 2015-07-12 07:30:10 · 4172 阅读 · 1 评论 -
【剑指Offer学习】【面试题35:第一个只出现一次的字符】
题目:在字符串中找出第一个只出现一次的字符。解题思路:第一种:直接求解:从头开始扫描这个字符串中的每个字符。当访问到某字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符相比较,因此这种思路的时间复杂度是O(n^2)。第二种:记录法原创 2015-07-05 06:28:47 · 4901 阅读 · 0 评论 -
【剑指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 · 7063 阅读 · 3 评论 -
【剑指Offer学习】【面试题11 :数值的整数次方】
实现函数double Power(double base, int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题。原创 2015-05-06 08:03:49 · 6764 阅读 · 2 评论 -
【剑指Offer学习】【面试题21:包含min 函数的栈】
题目: 定义栈的数据结构,请在该类型中实现一个能够得到栈的最小素的min 函数。在该栈中,调用min、push 及pop的时间复杂度都是0(1)解题思路:把每次的最小元素(之前的最小元素和新压入战的元素两者的较小值)都保存起来放到另外一个辅助栈里如果每次都把最小元素压入辅助栈, 那么就能保证辅助栈的栈顶一直都是最小元素.当最小元素从数据栈内被弹出之后,同时弹出辅助栈的栈顶元素,此时辅助栈的新栈顶元素原创 2015-06-30 08:12:40 · 5538 阅读 · 5 评论 -
【剑指Offer学习】【面试题36:数组中的逆序对】
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数。解题思路:第一种:直接求解 第二种:分析法原创 2015-07-05 06:52:31 · 15312 阅读 · 5 评论 -
【剑指Offer学习】【面试题63:二叉搜索树的第k个结点】
题目:给定一棵二叉搜索树,请找出其中的第k大的结点。解题思路 如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。结点定义private static class BinaryTreeNode { private int val; private BinaryTreeNode left;原创 2015-07-14 07:53:05 · 5272 阅读 · 1 评论 -
【剑指Offer学习】【面试题44:扑克牌的顺子】
题目:从扑克牌中随机抽5张牌,判断是不是一个顺子, 即这5张牌是不是连续的。2~10为数字本身, A为1。 J为11、Q为12、 为13。小王可以看成任意数字。解题思路:我们可以把5张牌看成由5个数字组成的数组。大、小王是特殊的数字,我们不妨把它们都定义为0,这样就能和其他扑克牌区分开来了。 接下来我们分析怎样判断5个数字是不是连续的,最直观的方法是把数组排序。值得注意的是,由于0可以当成任。原创 2015-07-08 08:13:10 · 6922 阅读 · 2 评论 -
【剑指Offer学习】【面试题43 : n 个锻子的点数】
题目:把n个骰子扔在地上,所有骰子朝上一面的点数之和为s。输入n,打印出s 的所有可能的值出现的概率。解题思路解法一:基于通归求解,时间效率不够高。解法二:基于循环求解,时间性能好原创 2015-07-07 08:48:28 · 3741 阅读 · 0 评论 -
【剑指Offer学习】【面试题9 : 斐波那契数列】
写一个函数,输入n,求斐波那契(Fibonacci) 数列的第n项原创 2015-05-04 07:18:13 · 8209 阅读 · 0 评论 -
【剑指Offer学习】【面试题8 : 旋转数组的最小数字】
题目: 把一个数组最开始的若干个元素搬到数组的末尾, 我们称之数组的旋转。输入一个递增排序的数组的一个旋转, 输出旋转数组的最小元素。例如数组{3,4, 5, 1, 2 }为{ l1,2,3, 4,5}的一个旋转,该数组的最小值为1原创 2015-05-03 11:55:25 · 8177 阅读 · 1 评论 -
【剑指Offer学习】【面试题7:用两个栈实现队列】
用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail 和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。原创 2015-05-03 11:22:36 · 7649 阅读 · 3 评论 -
【剑指Offer学习】【面试题5 : 从尾到头打印链表】
输入个链表的头结点,从尾到头反过来打印出每个结点的值。原创 2015-04-28 08:27:38 · 10222 阅读 · 2 评论 -
【剑指Offer学习】【面试题4 : 替换空格】
请实现一个函数,把字符串中的每个空格替换成"%20",例如“We are happy.”,则输出“We%20are%20happy.”。原创 2015-04-28 08:24:29 · 12752 阅读 · 11 评论 -
【剑指Offer学习】【面试题3 :二维数组中的查找】
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。原创 2015-04-28 08:21:35 · 22432 阅读 · 10 评论 -
【剑指Offer学习】【面试题10 :二进制中1 的个数】
实现一个函数, 输入一个整数,输出该数二进制表示中1的个数。原创 2015-05-04 07:22:59 · 7706 阅读 · 1 评论 -
【剑指Offer学习】【面试题6 :重建二叉树】
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字原创 2015-05-03 11:15:14 · 12213 阅读 · 5 评论 -
【剑指Offer学习】【面试题2 : 实现Singleton 模式——七种实现方式】
设计一个类,我们只能生成该类的一个实例原创 2015-04-28 08:17:23 · 27918 阅读 · 8 评论 -
【剑指Offer学习】【面试题37:两个链表的第一个公共结点】
题目:输入两个链表,找出它们的第一个公共结点。第一种:直接法第二种:使用栈第三种:先行法原创 2015-07-05 07:07:16 · 6398 阅读 · 1 评论 -
【剑指Offer学习】【面试题34:丑数】
题目:我们把只包含因子2、3 和5 的数称作丑数(Ugly Number)。求从小到大的顺序的第1500个丑数。解题思路:第一种:逐个判断每个数字是不是丑数的解法,直观但不够高效。第二种:创建数组保存已经找到丑数,用空间换时间的解法。原创 2015-07-04 08:27:16 · 4535 阅读 · 0 评论 -
【剑指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 · 5924 阅读 · 4 评论 -
【剑指Offer学习】【面试题49:把字符串转换成整数】
题目:实现一个函数stringToInt,实现把字符串转换成整数这个功能,不能使用atoi或者其他类似的库函数。题目解析 这看起来是很简单的题目,实现基本功能 ,大部分人都能用10行之内的代码解决。可是,当我们要把很多特殊情况即测试用例都考虑进去,却不是件容易的事。解决数值转换问题本身并不难,但我希望在写转换数值的代码之前,应聘者至少能把空指针,空字符串”“,正负号,溢出等方方面面的测试用例都考虑原创 2015-07-09 07:47:55 · 4597 阅读 · 0 评论 -
【剑指Offer学习】【面试题45:圆圈中最后剩下的数字(约瑟夫环问题)】
题目:0, 1, … , n-1 这n个数字排成一个圈圈,从数字0开始每次从圆圏里删除第m个数字。求出这个圈圈里剩下的最后一个数字。解题思路第一种:经典的解法, 用环形链表模拟圆圈。创建一个总共有n 个结点的环形链表,然后每次在这个链表中删除第m 个结点。第二种:分析法原创 2015-07-08 08:31:41 · 6794 阅读 · 4 评论 -
【剑指Offer学习】【面试题24:二叉搜索树的后序遍历序列】
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true。否则返回false。假设输入的数组的任意两个数字都互不相同。解题思路:在后序遍历得到的序列中, 最后一个数字是树的根结点的值。数组中前面的数字可以分为两部分: 第一部分是左子树结点的值,它们都比根结点的值小: 第二部分是右子树结点的值,它们都比根结点的值大。原创 2015-07-01 07:21:00 · 5118 阅读 · 4 评论 -
【剑指Offer学习】【面试题25:二叉树中和为某一值的路径】
题目:输入一棵二叉树和一个整数, 打印出二叉树中结点值的和为输入整数的所有路径。从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。由于路径是从根结点出发到叶结点, 也就是说路径总是以根结点为起始点,因此我们首先需要遍历根结点。在树的前序、中序、后序三种遍历方式中,只有前序遍历是首先访问根结点的。原创 2015-07-01 08:09:33 · 5576 阅读 · 3 评论 -
【剑指Offer学习】【面试题23:从上往下打印二叉树】
题目:从上往下打印出二叉树的每个结点,同一层的结点按照从左向右的顺序打印。解题思路:这道题实质是考查树的遍历算法。原创 2015-07-01 07:12:25 · 4110 阅读 · 2 评论 -
【剑指Offer学习】【面试题20 : 顺时针打印矩阵】
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次扫印出每一个数字解题思路:把打印一圈分为四步:第一步从左到右打印一行,第二步从上到下打印一列,第三步从右到左打印一行,第四步从下到上打印一列。每一步我们根据起始坐标和终止坐标用一个循环就能打印出一行或者一列。不过值得注意的是,最后一圈有可能退化成只有一行、只有一列,甚至只有一个数字,因此打印这样的一圈就不再需要四步。原创 2015-06-30 08:04:05 · 5139 阅读 · 1 评论