剑指offer(Java版)
文章平均质量分 61
互联网极客
执行力+团队合作+思考力=成功
展开
-
剑指Offer面试题7(Java版):用两个栈实现队列与用两个队列实现栈
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deletedHead,分别完成在队列尾部插入节点和在队列头部删除节点的功能。我们通过一个具体的例子来分析该队列插入和删除元素的过程。首先插入一个元素a,不妨先把它插入到stack1,此时stack1 中的元素有{a},stack2为空。再压入两个元素b和c,还是插入到stack1中,此时stack1中的元素有原创 2015-07-27 19:25:01 · 8579 阅读 · 3 评论 -
剑指Offer面试题17(Java版):合并两个排序的链表
题目:输入两个递增排序的链表,合并这两个链表并使新链表中的结点仍然是按照递增排序的。例如输入图中的链表1和链表2,则合并之后的升序链表3所示。这是一个经常被各公司采用的面试题。在面试过程中,我们发现应聘者最容易犯两个错误:一是在写代码之前没有对合并的过程想清楚,最终合并出来的链表要么中间断开要么并没有递增排序;二是代码的鲁棒性方面存在问题,程序一旦有特殊的输入(如空链表)就会崩溃。接下原创 2015-08-01 21:28:00 · 4383 阅读 · 1 评论 -
剑指Offer面试题15(Java版):链表中倒数第K个结点
题目: 输入一个链表,输出该链表中倒数第k哥结点。 为了符合大多数人的习惯,本题从1开始计数,即链表的尾结点是倒数第1个结点。 例如一个链表有6个结点,从头结点开始它们的值依次是1,2,3,4,5,6.这个链表的倒数第3个结点是值为4的结点为了得到第K个结点,很自然的想法是先走到链表的尾端,再从尾端回溯K步。可是我们从链表结点的定义可疑看出本题中的链表 是单向链表,单向链表的结点只有从原创 2015-08-01 15:28:40 · 3300 阅读 · 2 评论 -
剑指offer面试题14(Java版):调整数组顺序使奇数位于偶数的前面
题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。1、基本实现: 如果不考虑时间复杂度,最简单的思路应该是从头扫描这个数组,每碰到一个偶数时,拿出这个数字,并把位于这个数字后面的所有的数字往前面挪动一位。挪完之后在数组的末尾有一个空位,这时把该偶数放入这个空位。由于没碰到一个偶数就需要移动O(n)个数字,因此总的时间复原创 2015-08-01 12:41:07 · 6507 阅读 · 3 评论 -
剑指Offer面试题13(java版):在O(1)时间删除链表节点
题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点。在单向链表中删除一个节点,最常规的方法无疑是从链表的头结点开始,顺序遍历查找要删除的节点,并在链表中删除该节点。比如图a所表示的链表中,我们要删除节点i,可以从链表的头节点a开始顺序遍历,发现节点h的m_PNext指向要删除的节点i,于是我们可疑把节点h的m_PNext指向i的下一个节点即为j。指针调整之后,我原创 2015-07-31 20:55:53 · 4587 阅读 · 5 评论 -
剑指Offer面试题30(java版):最小的k个数
题目:输入n个整数,找出其中最小的k个数。例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是1,2,3,4原创 2015-08-08 20:47:08 · 4671 阅读 · 0 评论 -
剑指Offer面试题4(Java版),替换空格
题目:请实现一个函数,把字符串中的每个空格替换成“%20”。例如输入“We are happy",则输出”We%20are%20happy".原因:在网络编程中,如果URL参数中含有特殊字符,如:空格、“#”等,可能导致服务器端无法获得正确的参数值。我们需要将这些特殊符号转换成服务器识别的字符。转换规则是在“%”后面跟上ASCII码的两位十六进制的表。比如:空格的ASCII玛是32,即十六进制原创 2015-07-24 17:58:17 · 3975 阅读 · 1 评论 -
剑指Offer面试题3(Java版):二维数组中的查找
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下的数序排列。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数例如下面的二维数组就是每行、每列都递增排序。如果在这个数组中查找数字7,则返回true,如果要查找5,由于数组不含有该数字,则返回false1 2 8 92 4 9 124 7 10 136 8 1原创 2015-07-24 16:02:54 · 2558 阅读 · 2 评论 -
剑指Offer面试题11(Java版):数值的整数次方
题目:实现函数double Power(double base,int exponent),求base的exponent次方。不得使用库函数,同时不需要考虑大数问题1、自以为很简单的解法:由于不需要考虑大数问题,这道题看起来很简单,可能不少应聘者在看到题目30秒后就能写出如下的代码:public double powerWithExponent(double base,int expo原创 2015-07-31 08:43:09 · 3601 阅读 · 10 评论 -
剑指Offer面试题9(java版)斐波那契数列
题目一:写一个函数,输入n,求斐波那契数列的第n项。斐波那契数列的定义如下:1、效率很低效的解法,挑剔的面试官不会喜欢很多C语言的教科书在讲述递归函数的时候,都户拿Fibonacci作为例子,因此很多的应聘者对这道题的递归解法都很熟悉。下面是实现代码我们教科书上反复用这个问题来讲解递归的函数,并不能说明递归的解法最适合这道题目。面试官会提示我们上述递归的解法有很严重原创 2015-07-29 08:47:20 · 3668 阅读 · 3 评论 -
剑指Offer面试题12(Java版):打印1到最大的n位数
题目:输入数字n,按顺序打印出从1最大的的n位数十进制数。比如输入3,则打印出1,2,3一直到最大的3位数即999.1、跳进面试官的陷阱这个题目看起来很简单。我们看到这个问题后,最容易想到的办法是求出最大的n位数,然后用一个循环从1开始逐个打印。于是我们很容易写出下面的代码。void print1ToMaxOfNDigits(int n){ int number =1转载 2015-07-31 20:02:44 · 2149 阅读 · 1 评论 -
剑指Offer面试题19(Java版):二叉树的镜像
请完成一个函数,输入一个二叉树,该函数输出它的镜像。原创 2015-08-02 17:03:43 · 3499 阅读 · 0 评论 -
剑指Offer面试题27(Java版):二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建新的结点,只能调整树中结点指针的指向。比如如下图中的二叉搜索树,则输出转换之后的排序双向链表为:在二叉树中,每个结点都有两个指向子节点的指针。在双向链表中,每个结点也有两个指针,他们分别指向前一个结点和后一个结点。由于这两种结点的结构相似,同时二叉搜索树也是一种排序的数据结构,因此在理论上有可能实现二叉搜原创 2015-08-07 08:31:56 · 4476 阅读 · 4 评论 -
剑指Offer面试题20(Java版):顺时针打印矩阵
题目:输入一个矩阵,按照从外向里以顺时针的顺序依次打印出每一个数字。例如:如果输入如下矩阵:1,2,3,45,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.当遇到一个复杂的问题的时候,我们可以用图形来帮助我们来思考。由于是从外圈到内圈的顺序依次打印,我们可疑把矩阵想象成若干个原创 2015-08-02 20:41:00 · 4787 阅读 · 3 评论 -
剑指Offer面试题16(Java版):反转链表
题目:定义一个函数,输入一个链表的头结点,反转该链表并输出反转后链表的头结点。解决与链表相关的问题总是有大量的指针操作,而指针操作的代码总是容易出错的。很多的面试官喜欢出链表相关的问题,就是想通过指针操作来考察应聘者的编码功底。为了避免出错,我们最好先进行全面的分析。在实际软件开发周期中,设计的时间通常不会比编码的时间短。在面试的时候我们不要急于动手写代码,而是一开始仔细分析和涉及,这将会给面原创 2015-08-01 16:45:55 · 5994 阅读 · 0 评论 -
剑指Offer面试题21(Java版):包含min函数的栈
题目:定义栈的数据结构,请在该类型中实现一个能够得到栈的最小元素的min函数。在该栈中,调用min,push及pop的时间复杂度都是O(1).看到这个问题,我们的第一反应可能是每次压入一个新元素进栈时,将栈里的所有元素排序,让最小的元素位于栈顶,这样就能在O(1)时间得到最小元素了。但这种思路不能保证最后压入的元素能够最先出栈,因此这个数据结构已经不是栈了。我们接着想到在栈里添加一个成员变原创 2015-08-03 19:04:17 · 2811 阅读 · 0 评论 -
剑指Offer面试题25(Java版):二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点开始往下一直到叶结点所经过的所有的结点形成一条路径。如下图,输入二叉树和整数22,则打印出两条路径,第一条路径包含结点10,12,第二条路径包含的结点为10,5,7.一般的数据结构和算法的教材都没有介绍树的路径,因此对大多数应聘者而言,这是一个新概念,也就很难一下子想出完整的解题思路。这个时候我们可以原创 2015-08-05 09:08:06 · 7330 阅读 · 2 评论 -
剑指Offer面试题24(Java版):二叉搜索树的后序遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则返回true,否则返回false。假设输入的数组的任意两个数字都互不相同。例如输入数组{5,7,6,9,11,10,8}则返回true,因为这个整数序列是下图二叉树的后序遍历的结果。如果输入的数组是{7,4,6,5},由于没有哪颗二叉搜索树的后续遍历的结果是这个序列,因此返回false。在后序遍历得到的序原创 2015-08-04 20:26:12 · 2291 阅读 · 1 评论 -
剑指Offer面试题22(Java版):栈的压入、弹出序列
题目:输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否为该栈的弹出顺序。假设压入栈的所有数字均不相等。例如序列1,2,3,4,5是某栈的压栈序列,序列,4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。解决这个问题很直观的想法就是建立一个辅助栈,把输入的第一个序列中的数字依次压入该辅助栈,并按照第二个序列的顺序依次从该栈原创 2015-08-03 20:00:20 · 2770 阅读 · 1 评论 -
剑指Offer面试题23(Java版):从上往下打印二叉树
题目:从上往下打印二叉树的每个结点,同一层的结点按照从左到右的顺序打印。例如输入下图的二叉树,则一次打印出8,6,10,5,7,9,11.这道题实质上考察的就是树的遍历算法,只是这种遍历不是我们熟悉的前序、中序或者后序遍历。由于我们不太熟悉这种按层遍历的方法,可能已下载也想不清楚遍历的过程。因为按层打印的顺序决定应该先打印的根节点,所以我们从树的根节点开始分析。为了接下来能够打印8原创 2015-08-03 20:41:47 · 3179 阅读 · 0 评论 -
剑指Offer面试题18(Java版):树的子结构
题目:输入两棵二叉树A和B,判断B是不是A的子结构。例如图中所示的两棵二叉树,由于A中有一部分子树的结构和B 是一样的,因此B是A的子结构。要查找树A中是否存在和树B结构一样的子树,我们可以分两步:第一步在树A中找到和B的根节点的值一样的结点R,第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构。以上面的两棵树为例来详细分析这个过程。首先我们试着在树A中找到值为8的原创 2015-08-01 22:16:45 · 2949 阅读 · 0 评论 -
剑指Offer面试题6(Java版):重建二叉树
题目:输入某二叉树的前序遍历和中序遍历的结果,请重新构造出该二叉树。假设输入的前序遍历和中序遍历的结果中不包含重复的数字。例如输入的前序遍历序列为{1,2,4,7,3,5,6,8}和中序遍历为{4,7,2,1,5,3,6,8},则重建出二叉树并输出它的头结点。我们使用Java语言来实现上面的代码:首先构建二叉树代码:package utils;public class Binary原创 2015-07-27 18:36:52 · 8461 阅读 · 1 评论 -
剑指Offer面试题51(Java版):数组中重复的数字
题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数。请找出数组中任意一个重复的数字。例如如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是重复的数字2或者3.解决这个问题的一个简单的方法是先把输入的数组排序。从排序的数组中找出重复的数字是件容易的事情,只需要从头到尾扫描排序后的数组就原创 2015-08-12 08:36:41 · 6705 阅读 · 1 评论 -
剑指Offer面试题38(Java版):数字在排序数组中出现的次数
题目:统计一个数字在排序数组中出现的次数。例如输入排序数组为{1,2,3,3,,3,3,4,5}和数字3,由于3在这个数组中出现了4次,因此输出4既然输入的数组是排序的,那么我们很自然的想到利用二分查找算法。在题目给出的例子中,我们可以先用二分查找算法找到第一个3.由于3可能出现多次,因此我们找到的3的左右两遍可能都是3,于是我们在找到3的左右两边顺序扫描,分别找出第一个3和最后一个3.因原创 2015-08-09 22:37:57 · 1374 阅读 · 0 评论 -
剑指Offer面试题33(java版):把数组排成最小的数
题目:输入一个正整数数组,把数组里面所有的数字拼接排成一个数,打印能拼接出的所有数字中的一个。例如输入数组{3,32,321},则打印出这3个数字能排成的最小数字321323.这个题目最直接的做法应该是先求出这个数组中的所有数字的全排列,然后把每个排列拼接起来,最后求出排列起来的数字的最小值。求数组的排列和面试题28非常相似。根据排列组合的只是,n个数字总共有n!排列,我们再来看一下更快的算法原创 2015-08-09 11:12:10 · 5101 阅读 · 0 评论 -
剑指Offer面试题32(java版):从1到n整数中1出现的次数
题目:输入一个整数n,求从1到n个整数的十进制表示中1出现的次数。例如输入12,从1到12这些整数中包含1的数字有1,10,11,和12,1一共出现了5次。方法一:不考虑时间效率的解法,靠它拿到Offer有点难:如果在面试的时候碰到这个问题,应聘者大多能想到最直观的方法,也就是累加1到n中每个整数1出现的次数。我们可疑每次通过对10求余数判断整数的个位数字是不是1.如果这个数字大于10,除原创 2015-08-09 08:49:48 · 2090 阅读 · 2 评论 -
剑指Offer面试题35(java版):第一个只出现一次的字符
题目:在字符串中找出第一个只出现一次的字符。如输入"abaccdeff",则输出'b'.看到这样的题目,我们最直观的想法就是从头开始扫描这个字符串中的字符。当访问某个字符时拿这个字符和后面的每个字符相比较,如果在后面没有发现重复的字符,则该字符就是只出现一次的字符。如果字符串有n个字符,每个字符可能与后面的O(n)个字符想比较,因此这种思路的时间复杂度为O(n2),面试官不会满意这种思路,它会原创 2015-08-09 16:14:41 · 4290 阅读 · 0 评论 -
剑指Offer面试题36(Java版):数组中的逆序对
题目:在数组中的两个数字如果前面一个数字大于后面的数字,则这两个数字组成一个逆序对。输入一个数组,求出这个数组中的逆序对的总数例如在数组{7,5,6,4}中,一共存在5对逆序对,分别是{7,6},{7,5},{7,4},{6,4},{5,4}。看到这个题目,我们的第一反应就是顺序扫描整个数组。每扫描到一个数组的时候,逐个比较该数字和它后面的数字的大小。如果后面的数字比它小,则这两个数字就组原创 2015-08-09 20:04:05 · 3467 阅读 · 0 评论 -
剑指Offer面试题34(java版):丑数
题目:丑数 * 我们把只包含因子2,3,5的数称为丑数(Ugly Number). * 求按从小到大的顺序的第1500个丑数。 * 例如6,8都是丑数,但14不是,因为它含有因子7.习惯上我们把1当作第一个丑数方法一:逐个判断每个整数是不是丑数的解法,直观但不够高效:所谓一个数m是另一个数n的因子,是指n能被m整除,也就是说n%m==0.根据丑数的定义,丑数只能被2,3,5整除原创 2015-08-09 15:44:16 · 6563 阅读 · 4 评论 -
剑指Offer面试题29(java版):数组中出现次数超过一半的数字
题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。例如输入一个长度为9的数组{1,2,3,2,2,2,5,4,2}。由于数字2在数组中出现5次,超过数组长度的一半,因此输出2.原创 2015-08-08 19:25:35 · 3216 阅读 · 0 评论 -
剑指Offer面试题8(java版):旋转数组的最小数字
题目: 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为旋转。 输入一个递增的排序的数组的一个旋转,输出旋转数组的最小元素。 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋转,该数组的最小元素为1.这道题最直观的解法并不难,从头到尾遍历一次,我们就能找到最小的元素。这种思路的时间复杂度为O(n)。但是这个思路没有利用输入的旋转数组的特性,肯定达不到面试官的要求。我原创 2015-07-28 17:26:03 · 6601 阅读 · 4 评论 -
剑指Offer面试题31(java版):连续子数组的最大和
题目:输入一个整型数组,数组里有正数也有负数。数组中一个或连续的多个整数组成一个子数组。 求所有子数组的和的最大值。要求时间复杂度为O(n)例如输入的数组为{1,-2,3,10,-4,7,2,-5}原创 2015-08-08 21:42:56 · 1816 阅读 · 0 评论 -
剑指Offer面试题37(Java版):两个链表的第一个公共结点
题目:输入两个链表,找出它们的第一个公共结点。面试的时候碰到这道题,很多应聘者的第一反应就是蛮力法:在第一链表上顺序遍历每个结点,没遍历到一个结点的时候,在第二个链表上顺序遍历每个结点。如果在第二个链表上有一个结点和第一个链表上的结点一样,说明两个链表在这个结点上重合,于是就找到了他们的公共结点。如果第一个链表的长度为m,第二个链表的长度为n,显然该方法的时间复杂度为O(mn).通常蛮力法原创 2015-08-09 21:40:44 · 2553 阅读 · 1 评论 -
剑指Offer面试题39(Java版):二叉树的深度
题目:输入一棵二叉树的根节点,求该数的深度。从根节点到叶结点依次进过的结点(含根,叶结点)形成树的一条路径,最长路径的长度为树的深度。例如,如下图的二叉树的深度为4,因为它从根节点到叶结点的最长的路径包含4个结点(从根结点1开始,经过2和结点5,最终到达叶结点7)我们可以从另一种角度来理解树的深度。如果一棵树只有一个结点,它的深度为1,如果根节点只有左子树而没有右子树,那么树的深度应该...原创 2015-08-10 08:42:12 · 4095 阅读 · 7 评论 -
剑指Offer面试题5(Java版):从尾到头打印链表
题目:输入一个链表的头结点,从尾到头反过来打印出每个节点的值。看到这道题,很多人的第一反应是从头到尾输出将会比较简单,于是我们很自然的想到把链表中的节点的指针反转过来,改变链表的方向,然后就可以从头到尾输出了。但该方法改变原来链表的结构。是否允许在打印链表的时候修改链表的结构?这个取决于面试官的要求,因此在面试的时候我们要询问清楚面试官的要求。通常打印是一个只读操作,我们不希望打印原创 2015-07-25 09:24:23 · 1501 阅读 · 0 评论 -
剑指Offer面试题45(Java版):圆圈中最后剩下的数字
题目:0,1,,,,,n-1这n 个数字排成一个圆圈,从数字0开始每次从这个圆圈中删除第m个数字。求出这个圆圈里剩下的最后一个数字。例如,0,1,2,3,4这5个数字组成的一个圆圈,从数字0开始每次删除第3个数字,则删除的前四个数字依次是2,0,4,1因此最后剩下的数字是3.本题就是著名的约瑟夫环的问题。我们介绍两种方法:一种方法是用环形链表模拟圆圈的经典解法,第二种方法是分析每次被删除的原创 2015-08-11 20:08:24 · 2875 阅读 · 0 评论 -
剑指Offer面试题44(Java版):扑克牌的顺序
题目:从扑克牌中随机抽出5张牌,判断是不是一个顺子,即这五张牌是不是连续的。2——10为数字本身,A为1,J为11,Q为12,K为13,而大小王为任意数字。我们需要把扑克牌的背景抽象成计算机语言。不难想象,我们可以把五张牌看成由五个数字组成的数组。大小王是特殊的数字,我们不妨把他们定义为0,这样就能和其他牌区分开来了。接下来我们分析判断5个数字是不是连续的,最直观的方法是把数组排序。值得注原创 2015-08-11 08:30:43 · 2197 阅读 · 1 评论 -
剑指Offer面试题42(Java版):反转单词顺序VS左旋转字符串
题目一:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串为“I am a Student.",则输出为”Student. a am i".这个题目是流传甚广,很多公司都多次拿来作为面试题,很多应聘者也多次在各种博客或者书籍上见到过通过两次翻转字符串的解法,于是很快可以跟面试官说出自己的思路:第一步反转句子中所有的字符。比如翻原创 2015-08-10 20:48:11 · 4693 阅读 · 1 评论 -
剑指Offer面试题10(Java版):二进制中的1的个数
题目:请实现一个函数,输入一个整数,输出该数二进制表示中1的个数。例如把9表示成二进制是1001,有2位是1,因此如果输入9,该函数输出2.1、可能引起死循环的解法这是一道很基本的考察二进制和位运算的面试题。题目不是很难,面试官提出问题之后,我们很快形成一个基本的思路:先判断证书二进制表示中最右边一位是不是1.接着把输入的证书右移一位,此时原来处于从右边树起的第二位被移到最后一位,再判断是原创 2015-07-30 08:17:39 · 3510 阅读 · 0 评论 -
剑指Offer面试题47(Java版):不用加减乘除做加法
题目:写一个函数,求两个整数之和,要求在函数体内不得适用+,-,* ,./ 四则运算符号面试的时候被问道这个问题,首先我们分析人们是如何进行十进制的加法的,比如是如何得出5+17=22的结果的,实际上,我们可以分三步进行:第一步只做各位相加不进位,此时相加的结果是12,第二步做进位,5+7中有进位,进位的值为10;第三步,把前面的两个结果加起来12+10的结果是22,刚好5+17=22我原创 2015-08-11 20:49:22 · 1740 阅读 · 0 评论