
面试算法100题
Ethan_pika
一个爱养花的程序员
展开
-
Interview100-54 调整数组顺序使奇数位于偶数之前
题目调整数组顺序使奇数位于偶数之前。输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分,要求时间复杂度为O(n)。解法该题的思想让我想到QUICK-SORT中的PARTITIOIN方法思想。借鉴PARTITION方法的思想,得到的算法伪代码如下,时间复杂度为O(n):ADJUST-ARRAY(int[] array): in...原创 2019-03-05 00:16:53 · 166 阅读 · 0 评论 -
Interview100-19 输出Fibonacci数列的第n项
题目一直Fibonacci数列,输入n,用最快的方式求改该数列的第n项。解法1. 递归方法。这是一个经典的递归求解方法,我们知道Fibonacci数列的递归式为F(n) = F(n-1)+F(n-2)。这样就可以使用递归的方式求得该数列的第n项。但这种方式总是在计算重复的值,例如计算F(8)时计算了F(1)到F(7),而计算F(9)时有计算了一遍F(1)到F(8),其中F(1)到F(7...原创 2019-03-04 15:21:57 · 277 阅读 · 0 评论 -
Interview100-17 查找字符串中只出现一次的字符
题目(2006 Google)在一个字符串中找到第一个只出现一次的字符,如输入:abaccdeff,则返回b。解法1. 暴力破解方法O(n*n)。第一次循环遍历字符串中的每个字符,然后第二层循环,使用当前字符遍历之后的整个字符串,如果之后字符串中没有重复的字符,则为第一个只出现一次的字符。2. 这里可以考虑参照计数排序的思想,使用一个辅助空间,对字符数组中的每个字符进行计数,然后遍...原创 2019-03-04 01:16:18 · 304 阅读 · 0 评论 -
Interview100-16 层序遍历二叉树
题目输入一棵二叉树,从上往下按层打印树的每个阶段,同一层按照从左往右的顺序打印。解法二叉树的层序遍历有点类似于图的广度优先遍历算法(DFS)的思想。迭代方法:使用一个辅助优先级队列,出队列一个节点时,遍历它的左右孩子,然后左右孩子入队列,当优先级队列为空时,迭代完成。DFS-BINARYTREE(BSTreeNode root): // 这里使用了二叉搜索树的节点结构,但这里可以...原创 2019-03-03 22:37:55 · 149 阅读 · 0 评论 -
Interview100-15 构建二叉搜索树的镜像树
题目输入一棵二叉搜索树,将该树转换为它的镜像,即再转换后的二叉搜索树中,左子树的节点都大于右子树的节点。用递归和非递归两种方法实现。解法1. 关于树的问题较多的采用递归的思想,这里的递归思想为:从根结点开始,交换它的左右子树,然后依次交换左孩子的左右子树和右孩子的左右子树。递归完成即可。2. 非递归的版本,迭代版本需要一个辅助stack的使用。每次去栈顶元素,交换它的左右孩子,然后...原创 2019-03-03 22:27:23 · 222 阅读 · 0 评论 -
Interview100-13 输出链表倒数第k个结点
题目输入一个单向链表,输出该链表中倒数第k个节点。链表的倒数第0个节点为链表的尾指针。链表节点的定义如下:ListNode { int value; ListNode next;}解法1. 这个问题,我们可能会想到先反转链表再找到第k个节点,但这样会比较麻烦。2. 考虑一种方法:首先将一个指针end从头节点移动到正数第k个节点上,然后将另一个指针star...原创 2019-03-03 22:10:49 · 131 阅读 · 0 评论 -
Interview100-11 求二叉树中节点的最大距离
题目如果我们将二叉树看成一个图,父子节点之间的连线看成双向的边,我们定义”距离“为两个节点之间边的个数。设计一个算法,求出一个二叉树中相距最远的两个节点之间的距离。解法思路:二叉树中两个结点之间的最大距离,是如下两种情况中的最大值,第一种为:根结点到叶子节点的深度最大值。第二种为两个叶子节点之间的距离最大值。因此计算出二叉树中所有节点间的距离,取最大值。GET-MAX-DISTA...原创 2019-03-03 21:03:47 · 282 阅读 · 0 评论 -
Interview100-8.1 计算整数组中重复出现两次的数
题目假设你有一个用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?解法1. 如果使用辅助存储的方式,这里可以选择Hash表,或者是HashMap进...原创 2019-03-03 18:11:03 · 500 阅读 · 0 评论 -
Interview100-8 一系列反转问题
问题1用一种算法来颠倒一个链表的顺序。要求不用递归。解法REVERSE-LIST(Node L.head): if L.head == null return L.head; prev = L.head; cur = prev.next; while cur != null prev.next = cur.next; ...原创 2019-03-03 17:47:49 · 292 阅读 · 0 评论 -
Interview100-100 一些微软面试题4
题目1. 12个球一个天平,现知道只有一个和其他的重量不同,问怎么样称才能用三次就找到那个球。如果是13个球呢?(注意此题并没有说明那个球的重量是轻是重,所以需要仔细考虑)(5min-1hour)2. 在9个点上画10条线,要求每条线上至少有三个点。(3min-20min)3. 在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎么样算出来的?...原创 2019-03-07 00:10:51 · 251 阅读 · 0 评论 -
Interview100-99 一些微软面试题3(思维)
题目1. 烧一根不均匀的绳,从头烧到尾总共需要1个小时,现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时15分钟?2. 你有一桶果冻,其中有黄色、绿色和红色三种,闭上眼睛抓取同种颜色的两个,抓取多少个就可以确定你肯定有两个同一颜色的果冻(5s-1min)?3. 如果你有无穷多的水,一个3L的提桶,一个5L的提桶,两只提桶形状上下都不均匀,问你如何才能准确称出4L的水?(40...原创 2019-03-07 00:12:17 · 230 阅读 · 0 评论 -
Interview100-20 字符串转换为整数输出
题目输入一个表示整数的字符串,把该字符串转换为整数进行输出。例如输入字符串”345“,则输出整数345.解法对于该问题,还是用到了ASCII编码。对于每一个字符-‘0’字符的ASCII码,即等于当前数字的ASCII码,然后进行按位累加就可以了。同时需要注意的为:输入的字符串是否存在负号,需要单独处理 输入的字符串需要进行判空 需要判断非法输入STRING-TO-NUMB...原创 2019-03-04 01:37:40 · 183 阅读 · 0 评论 -
Interview100-21 n个整数中和为m的组合
题目(2010 中兴)编程求解:输入两个整数n和m,从数列1,2,3,..,n中随意取几个数,使其和为m,要求将其中所有的可能列出来。求解这个问题可以看成背包问题的变形,n个物品,放入k个包中,每个包的容量为m。分包问题的解决方法为使用一个递归方式。求解思路如下:递归结束的条件:n<1 or m<1 如果n>m,则n中大于m的数都可以舍去,即可以置n=m 对于...原创 2019-03-04 12:08:43 · 649 阅读 · 0 评论 -
Interview100-52 二叉树的深度
题目输入一棵二叉树的根结点,求该树的深度,从根结点到叶子节点依次经过的节点(含根和叶子)形成一个树的一条路径,最长路径的长度为树的深度。解法其实这一个问题已经在Interview100-11 求二叉树中节点的最大距离,这个问题中解决了。思想就是,递归的找出根结点左右两个子树中的深度的最大值即为树的深度。GET-DEPTH(BSTreeNode root): int dep...原创 2019-03-05 00:15:57 · 113 阅读 · 0 评论 -
Interview100-47 求一个数组中最长递减子序列
题目(创新工场)求一个数组的最长递减子序列,例如[9,4,3,2,5,4,3,2]的最长递减子序列为[9,5,4,3,2]。求解考虑如下思路:设原始的源数组为A,利用一个辅助数组B[A.length],其中每个元素记录了A[i]元素之前比该元素值大的元素个数,即A[i]记录的为以当前元素为结尾的递减子序列的元素个数。这样对A中所有元素进行计算后,找到B[i]的值最大对应的A[i]元素即...原创 2019-03-05 00:15:10 · 611 阅读 · 0 评论 -
Interview100-44 一些腾讯面试题
题目1. 设计一个六面模仿的程序(面向对象)2. 有1000w条短信,有重复,以文本文件的形式保存,一行一条,请用5分钟时间,找出重复出现最多的前10条。解法1. 第一题主要考察面向对象编程。2. 第二题为TOP K问题,分析如下:如果每条短信限定的长度在144chars之内,则1000w条短信为:1000w*144bytes=1.4GB左右,这种大小的数据可以一次性放入内...原创 2019-03-05 00:14:43 · 208 阅读 · 0 评论 -
Interview100-43 递归非递归实现二叉树的前序遍历
题目递归非递归实现二叉树的前序遍历,这里附加:中序遍历,后序遍历。解法1. 递归方法:首先为递归方法,递归方法的思想很简单,就是确定根结点与左右孩子之间的遍历顺序,下面为前序遍历的伪代码;PREORDER-TREE-WALK(BSTreeNode root): if root != null: PRINT root.value; PRE...原创 2019-03-04 17:46:04 · 133 阅读 · 0 评论 -
Interview100-38.2 从一个输入流中随机取出m个记录
题目(百度)有一个很大很大的输入流,大到没有存储器可以将其存储起来,而且只输入一次,如何从这个输入流中随机取得m个记录。解法思路:使用一个大小为m的辅助数组array,初始化为前m个元素,然后通过如下规则替换m个元素。对新输入的m+1到n中的第N(N>m)个元素,生成一个随机数R=rondom(N),范围为1到N,如果0<R<m,则将当前的元素N替换到array[R]...原创 2019-03-04 16:59:07 · 270 阅读 · 0 评论 -
Interview100-35 求一个矩阵中和最大的二维矩阵
题目求一个矩阵中元素和最大的二维矩阵,如:1 2 0 3 42 3 4 5 11 1 5 3 0和最大的二维矩阵为:4 55 3 要求:写出算法,分析时间复杂度解法1. 暴力方法:最容易想到的解法就是使用一个2x2的窗口进行逐行遍历,然后计算每个窗口中元素的和sum=array[i][j]+array[i+1][j]+array[i][j+1]+array[i+1...原创 2019-03-04 16:27:56 · 261 阅读 · 0 评论 -
Interview100-29 判断栈的push和pop序列
题目输入两个整数序列,其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop序列。为了 简单起见,我们假设push序列的任意两个整数都是不相等的。例如我们输入的push序列为:1,2,3,4,5,那么4,5,3,2,1就有可能是一个pop序列,但4,3,5,1,2就不可能是这个push序列得到的pop序列。解法新建一个栈对push序列的元素进行入栈出栈,使用pos...原创 2019-03-04 16:06:01 · 295 阅读 · 0 评论 -
Interview100-45 一些雅虎的面试题
题目1. 对于一个整数矩阵,存在一种运算,对矩阵中任意元素加1时,需要其相邻(上下左右)某个元素也加1,现在给出一个整数(正数)矩阵,判断其是否能够由一个全0的矩阵经过上述的运算得到。2. 一个整数数组,长度为n,将其分为m份,使各份的和相等,取m的最大值。例如 [3,2,4,3,6],可以分为 m=1: [3,2,4,3,6],m=2: [3,6] [2,4,3],m=3: [3,3][...原创 2019-03-07 00:49:40 · 236 阅读 · 0 评论 -
Interview100-28 整数二进制中1的个数
题目输入一个整数,求该整数的二进制表示中有多少个1。例如输入10,二进制为1010,有两个1,因此输出2.解法这个问题考察位运算,但解决思路不是很好想到。考虑一种方法:将输入整数的二进制表示-1后与原数做与运算,这样就会将该整数二进制的最后一位置为0,根据这个思路,能进行多少次这种运算,则整数的二进制表示中就有多少个1.COUNT-ONE-NUMBER(int n): i...原创 2019-03-04 13:10:21 · 197 阅读 · 0 评论 -
Interview100-27 跳台阶问题
题目原题目:(MicroStrategy)一个台阶总共有n级,如果一次可以跳1级或2级,求总共有多少种跳法,并分析算法的时间复杂度。拓展题目:如果一个台阶n级,一次可以条1级,2级,3级,...,n级台阶,那么跳上这个n级的台阶共有多少跳法。解法1. 对于原题目,由于只能一次跳1级或者一次跳2级台阶,那么对于问题规模为n的问题。对于最终跳上n级台阶,如果最后一次选择跳1级,那么之前...原创 2019-03-04 12:49:55 · 198 阅读 · 0 评论 -
Interview100-5 查找数组中最小的K个元素
题目输入n个整数,输出其中最小的k个数。例如,输入:[1,2,3,4,5,6,7,8],其中最小的4个数为:[1,2,3,4]。解法这个题目应该有很多种不同的思路和解法:1. 快速排序后输入前k个元素。首先想到快速排序是因为它在比较排序种的时间复杂度很低而且为原址排序不像归并排序那样需要辅助空间。快速排序的时间复杂度为:O(nlgn),因此这种方式的时间复杂度也就是:O(nlgn)...原创 2019-03-03 12:42:44 · 243 阅读 · 0 评论 -
Interview100-4 二叉搜索树中寻找元素和为给定值的路径
题目输入一个整数n和一个二叉搜索树。从数的根节点开始向下访问子节点直到叶子结点所经过的所有节点形成一条路径。在给定的二叉搜索树中寻找和为给定值n的所有路径。例如输入整数22,如下的二叉搜索树: 10 /\ 5 12 /\ 4 7则打印出两条满足条件的路径:10-5-7 和 10-12解法思想:由于还是树形结构,因此可以想到递归+回溯的方法...原创 2019-03-03 11:38:30 · 229 阅读 · 0 评论 -
Interview100-3 最大子数组问题
题目输入一个整型数组,其中有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都一个和。求所有子数组中和最大为多少(最优解的值),最大的子数组为什么(最优解)。要求时间复杂度为: O(n)。例如:输入的数组为:[1, -2, 3, 10, -4, 7, 2, -5],则和最大的子数组为:[3, 10, -4, 7, 2],和为18。解法1. 首先最大子数组问题为《算...原创 2019-03-03 01:20:42 · 147 阅读 · 0 评论 -
Interview100-79 链表和数组的排序算法选择
题目1. 编写实现链表排序的一种算法,说明为什么选择这种方法。2. 编写实现数组排序的一种算法,说明为什么使用这种方法。解法1. 对于链表,通常使用归并排序,时间复杂度为O(nlgn),没有新节点创建。2. 对于数组,通常采用快速排序,平均时间复杂度在比较排序算法中较低O(nlgn),且为原址稳定排序,不需要辅助空间。3. 此外,对于非比较排序,计数排序和桶排序,它们要求排...原创 2019-03-06 00:17:40 · 211 阅读 · 0 评论 -
Interview100-75 二叉树两个结点的最低共同父节点
题目二叉树的结点结构同BSTreeNode。输入一个二叉树中的两个结点。输出这两个结点再树种最低的共同父节点(LCA, Lowest Common Ancestor)。解法1. 递归方法。又是一个关于二叉树的问题。依然是递归方法解决。考虑如下情况:如果输入的两个结点X和Y,分别位于树的左右子树中,那么树的root结点就是它们的最低父节点。 如果两个结点都位于左子树,那么从该树的左...原创 2019-03-06 00:17:16 · 415 阅读 · 0 评论 -
Interview100-71 数值的整数次方
题目实现函数double Power(double base, int exponent),求base的exponent次方。不需要考虑溢出。解法这个题目看起来很简单,很容易写出如下的代码:POWER(double base, int exponent): double result = 1.0; for i = 1 to exponent(include): ...原创 2019-03-06 00:16:53 · 133 阅读 · 0 评论 -
Interview100-68 排列数组为最小的数
题目(2009.6 百度)把数组排列成最小的数。输入一个正整数的数组,将他们连接起来排成一个数,输出能够排出的所有数字中最小的一个。流入输入数组[32, 321],则输出这两个能排成的最小的数字为32132。请给出解决问题的算法,并证明该算法。解法1. 思路描述:(1)对于只有两个数的情况[3, 32],可以看出来332>323,因此需要交换3和32的顺序,然后直接拼接即为最小值...原创 2019-03-06 00:17:29 · 175 阅读 · 0 评论 -
Interview100-67.2 N个骰子和为S的问题
题目n个骰子的点数。把n个骰子扔在地上,所有骰子朝上的一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。解法1. 首先这个问题本身要求的时n个骰子朝上的点数之和为S的这种取值的概率P。P=和为S出现的次数 / 所有点数之和的可能性。由于骰子的点数只有1到6,所以n个骰子的所有点数之和的可能性为6的n次方。这样这个问题就可以转换为求n个骰子点数之和为S的所有可能取值的问题,然...原创 2019-03-06 00:16:42 · 219 阅读 · 0 评论 -
Interview100-72 Singleton模式的几种实现方法
主要思想单例模式属于常见设计模式中的一种,且应用较多,它主要是使一个类的实例数量保持一个,主要实现的思想为:将该类的构造方法设为私有,外部无法直接使用该类的构造函数进行实例化这个类的对象。外部类只能使用该类提供的静态方法创建该类的实例对象。在该静态方法中,通过对该类的实例对象进行存在性判断,若已经存在则直接返回该实例对象,若不存在,则通过调用私有构造函数进行创建后并返回。它具有多种实现方式。...原创 2019-03-02 16:17:44 · 217 阅读 · 0 评论 -
Interview100-66 颠倒一个栈
题目用递归颠倒一个栈,例如输入栈[1,2,3,4,5],1在栈顶,颠倒之后的栈为[5,4,3,2,1],5在栈顶。解法1. 一种比较简单的做法是,使用一个辅助数组,将原始栈中的元素依次出栈,顺序存储到数组中,然后遍历数组中的元素进行入栈,这样就完成了栈的颠倒。但这样需要一个辅助的数组,且没有使用递归的特性。2. 使用递归。将原始栈的颠倒分为两个步骤:(1)栈顶元素放到栈底,(2)然...原创 2019-03-05 11:37:28 · 243 阅读 · 0 评论 -
Interview100-63 删除字符串中特定的字符
题目输入两个字符串,从第一个字符串中删除第二个字符串中所有的字符。例如,输入“They are students.” 和“aeiou”,则删除之后的第一个字符串变成“Thy r stdnts.”解法思路1:(简单的低效方式)遍历第一个字符串,对每一个字符遍历第二个字符串,如果当前字符存在于第二个字符串中,则删除。假设第一个字符串的长度为n,第二个字符串的长度为m,则这种方式的时间复杂度...原创 2019-03-05 01:29:57 · 191 阅读 · 0 评论 -
Interview100-61 找出数组中两个只出现一次的数字
题目1. 一个整型数组里除了两个数字之外,其他的数字都出现了两次,请写出一个程序找出这两个只出现一次的数字。要求时间复杂度为O(n),空间复杂度为O(1)。2. 同样一个整性数组中只有一个数字出现一次,其他的都出现了两次,写出一个程序找出这一个只出现一次的数字。时间和空间复杂度的要求同题1.解法解决问题2:这里的两个问题其实都是考察位运算的知识。我们知道XOR的运算性质,A XOR...原创 2019-03-05 00:48:02 · 181 阅读 · 0 评论 -
Interview100-60 在O(1)时间内删除链表节点
题目给定链表的头指针和一个结点指针,在O(1)时间内删除该结点。解法1. 需要注意的是,这里只是删除该结点的步骤为O(1),而不是查找到该结点的时间复杂度。2. 求解思想:一般来说,我们删除链表中的一个结点是将在它前驱结点上进行操作,将它前驱结点的next指针指向K的后继节点,K的后继指向NULL,然后删除要删除的节点K即可。但由于这里仅给出了指向要删除结点K的指针,找到K的前驱结...原创 2019-03-05 00:15:54 · 135 阅读 · 0 评论 -
Interview100-58 从尾到头输出链表
题目输入一个链表的头节点(单链表),从尾到头反过来输出每个节点的值。解法这个题的解决思路可以是,先反转链表,然后从头到尾进行输出即可。反转链表的解法已经在Interview100-8 一系列反转问题给出,这里当作复习在给出一遍。这里使用的是原地反转链表,不需要额外的空间,时间复杂度为 O(n),反转后从头到尾遍历链表的时间复杂度同样为O(n),因此下面这个算法的时间复杂度为O(n)。...原创 2019-03-05 00:16:19 · 131 阅读 · 0 评论 -
Interview100-80 12人排队问题
题目(阿里)12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高。问排列方式有多少终?解法假设12个人从矮到高依次从0到11进行编号,(i,j)表示一个人在排队中的位置,那么(0, 0)位置一定是0号(最矮的),然后放置1号,1号可以放在(0,1)或(1,0)的位置。如下: 0 1 2 3 4 50 0 11 0 1 2 3 4 50...原创 2019-03-06 00:17:49 · 293 阅读 · 0 评论 -
Interview100-81.1 寻找数组中特定条件的所有数
题目(百度)一个int数组,里面数据无任何限制,要求求出所有这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它,能否只用一个额外的数组和少量的其他空间实现。解法1. 暴力解法。对数组中的每个数都搜索它之前的数,看是否小于它,搜索它之后的数,看是否大于它,如果两个条件都满足,则输出。2. 使用一个辅助数组,记录原数组中每个元素右边的最大值(包括自己),例如原数组为 [3,...原创 2019-03-06 00:18:02 · 221 阅读 · 0 评论 -
Interview100-1 将二叉搜索树转换为排序的双向链表
题目输入一棵二叉搜索树,将该二叉搜索树转换为一个排序的双向链表。要求不能创建任何新的节点,只能调整指针的方向。例如: 10 / \ 6 14 /\ /\ 4 8 12 16需要转换为的双向链表为:4=6=8=10=12=14=16。解法首先定义二叉搜索树的节点结构:BSTreeNode { int value...原创 2019-03-03 00:58:09 · 193 阅读 · 0 评论