1、1 .把二元查找树转变成排序的双向链表(树)题目:输入一棵二元查找树,将该二元查找树转换成一个排序的双向链表。要求不能创建任何新的结点,只调整指针的指向。1 0/ /6 1 4/ / / /4 8 1 2 1 6转换成双向链表4 =6 =8 =1 0 =1 2 =1 4 =1 6。首先我们定义的二元查找树 节点的数据结构如下:stru ct BSTre e No d ein t m_ n Va lu e ; / va lu e o f n o d eBSTre e No d e *m_ p L e ft; / le ft ch ild o f n o d eBSTre e No d e *m_
2、 p Rig h t; / rig h t ch ild o f n o d e;2 .设计包含min函数的栈(栈)定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。要求函数min、p u sh以及p o p的时间复杂度都是O(1 )。3 .求子数组的最大和(数组)题目:输入一个整形数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。求所有子数组的和的最大值。要求时间复杂度为O(n )。例如输入的数组为1 , -2 , 3 , 1 0 , -4 , 7 , 2 , -5,和最大的子数组为3 , 1 0 , -4 ,7 , 2,因此输出为该子
3、数组的和1 8。4 .在二元树中找出和为某一值的所有路径(树)题目:输入一个整数和一棵二元树。从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。打印出和与输入整数相等的所有路径。例如 输入整数2 2和如下二元树1 0 / / 5 1 2 / / 4 7则打印出两条路径:1 0 , 1 2和1 0 , 5 , 7。二元树节点的数据结构定义为:stru ct Bin a ryTre e No d e / a n o d e in th e b in a ry tre ein t m_ n Va lu e ; / va lu e o f n o d eBin a ryTre e No
4、 d e *m_ p L e ft; / le ft ch ild o f n o d eBin a ryTre e No d e *m_ p Rig h t; / rig h t ch ild o f n o d e;5 .查找最小的k个元素(数组)题目:输入n个整数,输出其中最小的k个。例如输入1,2,3,4,5,6,7和8这8个数字,则最小的4个数字为1,2,3和4。第6题(数组)腾讯面试题: 给你1 0分钟时间,根据上排给出十个数,在其下排填出对应的十个数 要求下排每个数都是先前上排那十个数在下排出现的次数。 上排的十个数如下: 【0,1,2,3,4,5,6,7,8,9】举一个例子,
5、数值: 0 ,1 ,2 ,3 ,4 ,5 ,6 ,7 ,8 ,9 分配: 6 ,2 ,1 ,0 ,0 ,0 ,1 ,0 ,0 ,0 0在下排出现了6次,1在下排出现了2次, 2在下排出现了1次,3在下排出现了0次 以此类推第7题(链表)微软亚院之编程判断俩个链表是否相交给出俩个单向链表的头指针,比如h 1,h 2,判断这俩个链表是否相交。为了简化问题,我们假设俩个链表均不带环。问题扩展:1 .如果链表可能有环列?2 .如果需要求出俩个链表相交的第一个节点列?第8题(算法)此贴选一些 比较怪的题,由于其中题目本身与算法关系不大,仅考考思维。特此并作一题。1 .有两个房间,一间房里有三盏灯,另一间
6、房有控制着三盏灯的三个开关,这两个房间是 分割开的,从一间里不能看到另一间的情况。现在要求受训者分别进这两房间一次,然后判断出这三盏灯分别是由哪个开关控制的。有什么办法呢?2 .你让一些人为你工作了七天,你要用一根金条作为报酬。金条被分成七小块,每天给出一块。如果你只能将金条切割两次,你怎样分给这些工人?3 . 用一种算法来颠倒一个链接表的顺序。现在在不用递归式的情况下做一遍。用一种算法在一个循环的链接表里插入一个节点,但不得穿越链接表。用一种算法整理一个数组。你为什么选择这种方法? 用一种算法使通用字符串相匹配。颠倒一个字符串。优化速度。优化空间。 颠倒一个句子中的词的顺序,比如将“我叫克丽
7、丝”转换为“克丽丝叫我”,实现速度最快,移动最少。 找到一个子字符串。优化速度。优化空间。比较两个字符串,用O(n )时间和恒量空间。 假设你有一个用1 0 0 1个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1 0 0 0 (包括1 0 0 0 )之间。此外,除一个数字出现两次外,其他所有数字只出现一次。假设你只能对这个数组做一次处理,用一种算法找出重复的那个数字。如果你在运算中使用了辅助的存储方式,那么你能找到不用这种方式的算法吗?不用乘法或加法增加8倍。现在用同样的方法增加7倍。第9题(树)判断整数序列是不是二元查找树的后序遍历结果题目:输入一个整数数组,判断该数组
8、是不是某二元查找树的后序遍历的结果。如果是返回tru e,否则返回fa lse。例如输入5、7、6、9、1 1、1 0、8,由于这一整数序列是如下树的后序遍历结果:8/ /6 1 0/ / / /5 7 9 1 1因此返回tru e。如果输入7、4、6、5,没有哪棵树的后序遍历的结果是这个序列,因此返回fa lse。第1 0题(字符串)翻转句子中单词的顺序。题目:输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。句子中单词以空格符隔开。为简单起见,标点符号和普通字母一样处理。例如输入“I a m a stu d e n t.”,则输出“stu d e n t. a a m I”。
9、第1 1题(树)求二叉树中节点的最大距离.如果我们把二叉树看成一个图,父子节点之间的连线看成是双向的,我们姑且定义“距离“为两节点之间边的个数。写一个程序,求一棵二叉树中相距最远的两个节点之间的距离。第1 2题(语法)题目:求1 +2 +n,要求不能使用乘除法、fo r、wh ile、if、e lse、switch、ca se等关键字以及条件判断语句(A? B:C)。第1 3题(链表):题目:输入一个单向链表,输出该链表中倒数第k个结点。链表的倒数第0个结点为链表的尾指针。链表结点定义如下: stru ct L istNo d ein t m_ n Ke y;L istNo d e * m_
10、p Ne xt;第1 4题(数组):题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n )。如果有多对数字的和等于输入的数字,输出任意一对即可。例如输入数组1、2、4、7、1 1、1 5和数字1 5。由于4 +1 1 =1 5,因此输出4和1 1。第1 5题(树):题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如输入:8/ /6 1 0/ /5 7 9 1 1输出:8/ /1 0 6/ /1 1 9 7 5定义二元查找树
11、的结点为:stru ct BSTre e No d e / a n o d e in th e b in a ry se a rch tre e (BST)in t m_ n Va lu e ; / va lu e o f n o d eBSTre e No d e *m_ p L e ft; / le ft ch ild o f n o d eBSTre e No d e *m_ p Rig h t; / rig h t ch ild o f n o d e;第1 6题(树):题目(微软):输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入8/ /6 1
12、 0/ / / /5 7 9 1 1输出8 6 1 0 5 7 9 1 1。第1 7题(字符串):题目:在一个字符串中找到第一个只出现一次的字符。如输入a b a ccd e ff,则输出b。 分析:这道题是2 0 0 6年g o o g le的一道笔试题。第1 8题(数组):题目:n个数字(0 ,1 ,n -1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。Ju ly:我想,这个题目,不少人已经 见识过了。第1 9题(数组、递归):
13、题目:定义Fib o n a cci数列如下: / 0 n =0f(n )= 1 n =1/ f(n -1 )+f(n -2 ) n =2输入n,用最快的方法求该数列的第n项。分析:在很多C语言教科书中讲到递归函数的时候,都会用Fib o n a cci作为例子。因此很多程序员对这道题的递归解法非常熟悉,但呵呵,你知道的。第2 0题(字符串):题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串“3 4 5 “,则输出整数3 4 5。第2 1题(数组)2 0 1 0年中兴面试题编程求解:输入两个整数 n 和 m,从数列1,2,3 .n 中 随意取几个数,使其和等于 m ,
14、要求将其中所有的可能组合列出来.第2 2题(推理):有4张红色的牌和4张蓝色的牌,主持人先拿任意两张,再分别在A、B、C三人额头上贴任意两张牌,A、B、C三人都可以看见其余两人额头上的牌,看完后让他们猜自己额头上是什么颜色的牌,A说不知道,B说不知道,C说不知道,然后A说知道了。请教如何推理,A是怎么知道的。如果用程序,又怎么实现呢?第2 3题(算法):用最简单,最快速的方法计算出下面这个圆形是否和正方形相交。“ 3 D坐标系 原点(0 .0 ,0 .0 ,0 .0 )圆形:半径r = 3 .0圆心o = (*.*, 0 .0 , *.*)正方形:4个角坐标; 1 :(*.*, 0 .0 ,
15、*.*)2 :(*.*, 0 .0 , *.*)3 :(*.*, 0 .0 , *.*)4 :(*.*, 0 .0 , *.*)第2 4题(链表):链表操作,单链表就地逆置,第2 5题(字符串):写一个函数,它的原形是in t co n tin u ma x(ch a r *o u tp u tstr,ch a r *in tp u tstr)功能:在字符串中找出连续最长的数字串,并把这个串的长度返回,并把这个最长数字串付给其中一个函数参数o u tp u tstr所指内存。例如:“a b cd 1 2 3 4 5 e d 1 2 5 ss1 2 3 4 5 6 7 8 9 “的首地址传给in
16、 tp u tstr后,函数将返回9,o u tp u tstr所指的值为1 2 3 4 5 6 7 8 92 6 .左旋转字符串(字符串)题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。如把字符串a b cd e f左旋转2位得到字符串cd e fa b。请实现字符串左旋转的函数。要求时间对长度为n的字符串操作的复杂度为O(n ),辅助内存为O(1 )。2 7 .跳台阶问题(递归)题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。这道题最近经常出现,包括Micro Stra te g y等比较重视算法的公司都曾先
17、后选用过个这道题作为面试题或者笔试题。2 8 .整数的二进制表示中1的个数(运算)题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入1 0,由于其二进制表示为1 0 1 0,有两个1,因此输出2。分析:这是一道很基本的考查位运算的面试题。包括微软在内的很多公司都曾采用过这道题。2 9 .栈的p u sh、p o p序列(栈)题目:输入两个整数序列。其中一个序列表示栈的p u sh顺序,判断另一个序列有没有可能是对应的p o p顺序。为了简单起见,我们假设p u sh序列的任意两个整数都是不相等的。比如输入的p u sh序列是1、2、3、4、5,那么4、5、3、2、1就有可能是一个p
18、 o p系列。因为可以有如下的p u sh和p o p序列:p u sh 1,p u sh 2,p u sh 3,p u sh 4,p o p,p u sh 5,p o p,p o p,p o p,p o p,这样得到的p o p序列就是4、5、3、2、1。但序列4、3、5、1、2就不可能是p u sh序列1、2、3、4、5的p o p序列。3 0 .在从1到n的正数中1出现的次数(数组)题目:输入一个整数n,求从1到n这n个整数的十进制表示中1出现的次数。例如输入1 2,从1到1 2这些整数中包含1 的数字有1,1 0,1 1和1 2,1一共出现了5次。分析:这是一道广为流传的g o o g
19、 le面试题。3 1 .华为面试题(搜索):一类似于蜂窝的结构的图,进行搜索最短路径(要求5分钟)3 2 .(数组、规划)有两个序列a ,b,大小都为n ,序列元素的值任意整数,无序;要求:通过交换a ,b中的元素,使序列a元素的和与序列b元素的和之间的差最小。例如: va r a =1 0 0 ,9 9 ,9 8 ,1 ,2 , 3 ;va r b =1 , 2 , 3 , 4 ,5 ,4 0 ;3 3 .(字符串)实现一个挺高级的字符匹配算法:给一串很长字符串,要求找到符合要求的字符串,例如目的串:1 2 31 *3 *2 ,1 2 *3这些都要找出来其实就是类似一些和谐系统。3 4 .(
20、队列)实现一个队列。队列的应用场景为:一个生产者线程将in t类型的数入列,一个消费者线程将in t类型的数出列3 5 .(矩阵)求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1 )写出算法;(2 )分析时间复杂度;(3 )用C写出关键代码第3 6题-4 0题(有些题目搜集于CSDN上的网友,已标明):3 6 .引用自网友:lo n g zu o(运算)谷歌笔试:n支队伍比赛,分别编号为0,1,2。n -1,已知它们之间的实力对比关系,存储在一个二维数组wn n 中,wij 的值代表编号为i,j的队伍中更强的
21、一支。所以wij=i 或者j,现在给出它们的出场顺序,并存储在数组o rd e rn 中,比如o rd e rn = 4 ,3 ,5 ,8 ,1 ,那么第一轮比赛就是 4对3, 5对8。.胜者晋级,败者淘汰,同一轮淘汰的所有队伍排名不再细分,即可以随便排,下一轮由上一轮的胜者按照顺序,再依次两两比,比如可能是4对5 ,直至出现第一名编程实现,给出二维数组w,一维数组o rd e r 和 用于输出比赛名次的数组re su ltn ,求出re su lt。3 7 .(字符串)有n个长为m+1的字符串,如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多
22、可以连成一个多长的字符串,如果出现循环,则返回错误。3 8 .(算法)百度面试:1 .用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x次天平,最多可以从y个小球中找出较轻的那个,求y与x的关系式。2 .有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入流中随机取得m个记录。3 .大量的URL字符串,如何从中去除重复的,优化时间空间复杂度3 9 .(树、图、算法)网易有道笔试:(1 ).求一个二叉树中任意两个节点间的最大距离,两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优
23、化时间空间复杂度。(2 ).求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,有向图不再连通,描述算法。4 0 .百度研发笔试题(栈、算法)引用自:zp 1 5 5 3 3 4 8 7 71 )设计一个栈结构,满足一下条件:min,p u sh,p o p操作的时间复杂度为O(1 )。2 )一串首尾相连的珠子(m个),有N种颜色(N2 -3 和 2 -3 -5 并为 1 -2 -3 -5另外只能输出结果,不能修改两个链表的数据。4 3 .递归和非递归俩种方法实现二叉树的前序遍历。4 4 .腾讯面试题(算法):1 .设计一个魔方(六面)的程序。2 .有一千万条短信,有重复,以文
24、本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前1 0条。3 .收藏了1万条u rl,现在给你一条u rl,如何找出相似的u rl。(面试官不解释何为相似)4 5 .雅虎(运算、矩阵):1 .对于一个整数矩阵,存在一种运算,对矩阵中任意元素加一时,需要其相邻(上下左右)某一个元素也加一,现给出一正数矩阵,判断其是否能够由一个全零矩阵经过上述运算得到。2 .一个整数数组,长度为n,将其分为m份,使各份的和相等,求m的最大值比如3,2,4,3,6 可以分成3,2,4,3,6 m=1 ; 3 ,6 2 ,4 ,3 m=23 ,3 2 ,4 6 m=3 所以m的最大值为34 6
25、 .搜狐(运算):四对括号可以有多少种匹配排列方式?比如两对括号可以有两种:()()和()4 7 .创新工场(算法):求一个数组的最长递减子序列 比如9,4,3,2,5,4,3,2 的最长递减子序列为9,5,4,3,2 4 8 .微软(运算):一个数组是由一个递减数列左移若干位形成的,比如4,3,2,1,6,5 是由6,5,4,3,2,1 左移两位形成的,在这种数组中查找某一个数。4 9 .一道看上去很吓人的算法面试题(排序、算法):如何对n个数进行排序,要求时间复杂度O(n ),空间复杂度O(1 )5 0 .网易有道笔试(so rry,与第3 9题重复):1 .求一个二叉树中任意两个节点间的
26、最大距离,两个节点的距离的定义是 这两个节点间边的个数,比如某个孩子节点和父节点间的距离是1,和相邻兄弟节点间的距离是2,优化时间空间复杂度。2 .求一个有向连通图的割点,割点的定义是,如果除去此节点和与其相关的边,有向图不再连通,描述算法。-5 1 .和为n连续正数序列(数组)。题目:输入一个正数n,输出所有和为n连续正数序列。例如输入1 5,由于1 +2 +3 +4 +5 =4 +5 +6 =7 +8 =1 5,所以输出3个连续序列1 -5、4 -6和7 -8。分析:这是网易的一道面试题。5 2 .二元树的深度(树)。题目:输入一棵二元树的根结点,求该树的深度。从根结点到叶结点依次经过的结
27、点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。例如:输入二元树:1 0/ /6 1 4/ / /4 1 2 1 6输出该树的深度3。二元树的结点定义如下:stru ct SBin a ryTre e No d e / a n o d e o f th e b in a ry tre ein t m_ n Va lu e ; / va lu e o f n o d eSBin a ryTre e No d e *m_ p L e ft; / le ft ch ild o f n o d eSBin a ryTre e No d e *m_ p Rig h t; / rig h t
28、 ch ild o f n o d e;分析:这道题本质上还是考查二元树的遍历。5 3 .字符串的排列(字符串)。题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串a b c,则输出由字符a、b、c所能排列出来的所有字符串a b c、a cb、b a c、b ca、ca b和cb a。分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在各大公司的面试、笔试题中。5 4 .调整数组顺序使奇数位于偶数前面(数组)。题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n )。5 5 .(语法
29、)题目:类CMyStrin g的声明如下:cla ss CMyStrin gp u b lic:CMyStrin g (ch a r* p Da ta = NUL L );CMyStrin g (co n st CMyStrin g CMyStrin g (vo id );CMyStrin g p riva te :ch a r* m_ p Da ta ;请实现其赋值运算符的重载函数,要求异常安全,即当对一个对象进行赋值时发生异常,对象的状态不能改变。5 6 .最长公共字串(算法、字符串)。题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串
30、。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。分析:求最长公共子串(L o n g e st Co mmo n Su b se q u e n ce , L CS)是一道非常经典的动态规划题,因此一些重视算法的公司像Micro Stra te g y都把它当作面试题。5 7 .用俩个栈实现队列(栈、队列)。题目:某队列的声明如下:te mp la te cla s
31、s CQu e u ep u b lic:CQu e u e () CQu e u e () vo id a p p e n d Ta il(co n st T / a p p e n d a e le me n t to ta ilvo id d e le te He a d (); / re mo ve a e le me n t fro m h e a dp riva te :T m_ sta ck1 ;T m_ sta ck2 ;分析:从上面的类的声明中,我们发现在队列中有两个栈。因此这道题实质上是要求我们用两个栈来实现一个队列。相信大家对栈和队列的基本性质都非常了解了:栈是一种后入先
32、出的数据容器,因此对队列进行的插入和删除操作都是在栈顶上进行;队列是一种先入先出的数据容器,我们总是把新元素插入到队列的尾部,而从队列的头部删除元素。5 8 .从尾到头输出链表(链表)。题目:输入一个链表的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:stru ct L istNo d ein t m_ n Ke y;L istNo d e * m_ p Ne xt;分析:这是一道很有意思的面试题。该题以及它的变体经常出现在各大公司的面试、笔试题中。5 9 .不能被继承的类(语法)。题目:用C+设计一个不能被继承的类。分析:这是Ad o b e公司2 0 0 7年校园招聘的最新笔试
33、题。这道题除了考察应聘者的C+基本功底外,还能考察反应能力,是一道很好的题目。6 0 .在O(1)时间内删除链表结点(链表、算法)。题目:给定链表的头指针和一个结点指针,在O(1 )时间删除该结点。链表结点的定义如下:stru ct L istNo d ein t m_ n Ke y;L istNo d e * m_ p Ne xt;函数的声明如下:vo id De le te No d e (L istNo d e * p L istHe a d , L istNo d e * p To Be De le te d );分析:这是一道广为流传的Go o g le面试题,能有效考察我们的编程基
34、本功,还能考察我们的反应速度,更重要的是,还能考察我们对时间复杂度的理解。-6 1 .找出数组中两个只出现一次的数字(数组)题目:一个整型数组里除了两个数字之外,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。要求时间复杂度是O(n ),空间复杂度是O(1 )。分析:这是一道很新颖的关于位运算的面试题。6 2 .找出链表的第一个公共结点(链表)。题目:两个单向链表,找出它们的第一个公共结点。链表的结点定义为:stru ct L istNo d ein t m_ n Ke y;L istNo d e * m_ p Ne xt;分析:这是一道微软的面试题。微软非常喜欢与链表相关的题目,
35、因此在微软的面试题中,链表出现的概率相当高。6 3 .在字符串中删除特定的字符(字符串)。题目:输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。例如,输入”Th e y a re stu d e n ts.”和”a e io u ”,则删除之后的第一个字符串变成”Th y r std n ts.”。分析:这是一道微软面试题。在微软的常见面试题中,与字符串相关的题目占了很大的一部分,因为写程序操作字符串能很好的反映我们的编程基本功。6 4 . 寻找丑数(运算)。题目:我们把只包含因子2、3和5的数称作丑数(Ug ly Nu mb e r)。例如6、8都是丑数,但1 4不是,因为它包含
36、因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1 5 0 0个丑数。分析:这是一道在网络上广为流传的面试题,据说g o o g le曾经采用过这道题。6 5 .输出1到最大的N位数(运算)题目:输入数字n,按顺序输出从1最大的n位1 0进制数。比如输入3,则输出1、2、3一直到最大的3位数即9 9 9。分析:这是一道很有意思的题目。看起来很简单,其实里面却有不少的玄机。6 6 .颠倒栈(栈)。题目:用递归颠倒一个栈。例如输入栈1 , 2 , 3 , 4 , 5 ,1在栈顶。颠倒之后的栈为5 , 4 , 3 , 2 , 1 ,5处在栈顶。6 7 .俩个闲玩娱乐(运算)。1 .扑克
37、牌的顺子从扑克牌中随机抽5张牌,判断是不是一个顺子,即这5张牌是不是连续的。2 -1 0为数字本身,A为1,J为1 1,Q为1 2,K为1 3,而大小王可以看成任意数字。2 .n个骰子的点数。把n个骰子扔在地上,所有骰子朝上一面的点数之和为S。输入n,打印出S的所有可能的值出现的概率。6 8 .把数组排成最小的数(数组、算法)。题目:输入一个正整数数组,将它们连接起来排成一个数,输出能排出的所有数字中最小的一个。例如输入数组3 2 , 3 2 1 ,则输出这两个能排成的最小数字3 2 1 3 2。请给出解决问题的算法,并证明该算法。分析:这是0 9年6月份百度的一道面试题,从这道题我们可以看出
38、百度对应聘者在算法方面有很高的要求。6 9 .旋转数组中的最小元素(数组、算法)。题目:把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转。输入一个排好序的数组的一个旋转,输出旋转数组的最小元素。例如数组3 , 4 , 5 , 1 , 2 为1 , 2 , 3 , 4 , 5 的一个旋转,该数组的最小值为1。分析:这道题最直观的解法并不难。从头到尾遍历数组一次,就能找出最小的元素,时间复杂度显然是O(N)。但这个思路没有利用输入数组的特性,我们应该能找到更好的解法。7 0 .给出一个函数来输出一个字符串的所有排列(经典字符串问题)。ANSWER 简单的回溯就可以实现了。当然排列的
39、产生也有很多种算法,去看看组合数学,还有逆序生成排列和一些不需要递归生成排列的方法。印象中Kn u th的第一卷里面深入讲了排列的生成。这些算法的理解需要一定的数学功底,也需要一定的灵感,有兴趣最好看看。7 1 .数值的整数次方(数字、运算)。题目:实现函数d o u b le Po we r(d o u b le b a se , in t e xp o n e n t),求b a se的e xp o n e n t次方。不需要考虑溢出。分析:这是一道看起来很简单的问题。可能有不少的人在看到题目后3 0秒写出如下的代码:d o u b le Po we r(d o u b le b a se
40、 , in t e xp o n e n t)d o u b le re su lt = 1 .0 ;fo r(in t i = 1 ; i =le n 2,那么指针p 1由h e a d 1开始向后移动le n 1 -le n 2步,指针p 2 =h e a d 2,下面p 1、p 2每次向后前进一步并比较p 1 p 2是否相等,如果相等即返回该结点,否则说明两个链表没有交点。3 .给定单链表(h e a d ),如果有环的话请返回从头结点进入环的第一个节点。运用题一,我们可以检查链表中是否有环。如果有环,那么p 1 p 2重合点p必然在环中。从p点断开环,方法为:p 1 =p , p 2
41、=p -n e xt, p -n e xt=NUL L。此时,原单链表可以看作两条单链表,一条从h e a d开始,另一条从p 2开始,于是运用题二的方法,我们找到它们的第一个交点即为所求。4 .只给定单链表中某个结点p (并非最后一个结点,即p -n e xt!=NUL L )指针,删除该结点。办法很简单,首先是放p中数据,然后将p -n e xt的数据co p y入p中,接下来删除p -n e xt即可。5 .只给定单链表中某个结点p (非空结点),在p前面插入一个结点。办法与前者类似,首先分配一个结点q,将q插入在p后,接下来将p中的数据co p y入q中,然后再将要插入的数据记录在p中
42、。7 8 .链表和数组的区别在哪里(链表、数组)?分析:主要在基本概念上的理解。但是最好能考虑的全面一点,现在公司招人的竞争可能就在细节上产生,谁比较仔细,谁获胜的机会就大。7 9 .(链表、字符串)1 .编写实现链表排序的一种算法。说明为什么你会选择用这样的方法?2 .编写实现数组排序的一种算法。说明为什么你会选择用这样的方法?3 .请编写能直接实现strstr()函数功能的代码。8 0 .阿里巴巴一道笔试题(运算、算法)问题描述:1 2个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?这个笔试题,很YD,因为把某个递归关系隐藏得很深。先来
43、几组百度的面试题:=8 1 .第1组百度面试题1 .一个in t数组,里面数据无任何限制,要求求出所有这样的数a i,其左边的数都小于等于它,右边的数都大于等于它。能否只用一个额外数组和少量其它空间实现。2 .一个文件,内含一千万行字符串,每个字符串在1 K以内,要求找出所有相反的串对,如a b c和cb a。3 .STL的se t用什么实现的?为什么不用h a sh?8 2 .第2组百度面试题1 .给出两个集合A和B,其中集合A=n a me ,集合B=a g e、se x、sch o la rsh ip、a d d re ss、.,要求:问题1、根据集合A中的n a me查询出集合B中对应
44、的属性信息;问题2、根据集合B中的属性信息(单个属性,如a g e , , , , , , 那么,现在给出一个整型序列,请找出这些捣乱分子对的个数(仅给出捣乱分子对的数目即可,不用具体的对)要求:输入:为一个文件(in ),文件的每一行为一个序列。序列全为数字,数字间用”,”分隔。输出:为一个文件(o u t),每行为一个数字,表示捣乱分子的对数。详细说明自己的解题思路,说明自己实现的一些关键点。并给出实现的代码 ,并分析时间复杂度。限制:输入每行的最大数字个数为1 0 0 0 0 0个,数字最长为6位。程序无内存使用限制。9 3 .在一个in t数组里查找这样的数,它大于等于左侧所有数,小于
45、等于右侧所有数。直观想法是用两个数组a、b。a i、b i分别保存从前到i的最大的数和从后到i的最小的数,一个解答:这需要两次遍历,然后再遍历一次原数组,将所有d a ta i=a i-1 其中strDe st 是目的字符串,strSrc 是源字符串。不调用C+/C 的字符串库函数,请编写函数 strcp y最后压轴之戏,终结此微软等1 0 0题系列V0 .1版。那就,连续来几组微软公司的面试题,让你一次爽个够:=9 7 .第1组微软较简单的算法面试题1 .编写反转字符串的程序,要求优化速度、优化空间。 2 .在链表里如何发现循环链接?3 .编写反转字符串的程序,要求优化速度、优化空间。4 .
46、给出洗牌的一个算法,并将洗好的牌存储在一个整形数组里。 5 .写一个函数,检查字符是否是整数,如果是,返回其整数值。(或者:怎样只用4行代码编写出一个从字符串到长整形的函数?)9 8 .第2组微软面试题1 .给出一个函数来输出一个字符串的所有排列。2 .请编写实现ma llo c()内存分配函数功能一样的代码。3 .给出一个函数来复制两个字符串A和B。字符串A的后几个字节和字符串B的前几个字节重叠。 4 .怎样编写一个程序,把一个有序整数数组放到二叉树中? 5 .怎样从顶部开始逐层打印二叉树结点数据?请编程。 6 .怎样把一个链表掉个顺序(也就是反序,注意链表的边界条件并考虑空链表)?9 9
47、.第3组微软面试题1 .烧一根不均匀的绳,从头烧到尾总共需要1个小时。现在有若干条材质相同的绳子,问如何用烧绳的方法来计时一个小时十五分钟呢?2 .你有一桶果冻,其中有黄色、绿色、红色三种,闭上眼睛抓取同种颜色的两个。抓取多少个就可以确定你肯定有两个同一颜色的果冻?(5秒-1分钟) 3 .如果你有无穷多的水,一个3公升的提捅,一个5公升的提捅,两只提捅形状上下都不均匀,问你如何才能准确称出4公升的水?(4 0秒-3分钟) 一个岔路口分别通向诚实国和说谎国。来了两个人,已知一个是诚实国的,另一个是说谎国的。诚实国永远说实话,说谎国永远说谎话。现在你要去说谎国,但不知道应该走哪条路,需要问这两个人
48、。请问应该怎么问?(2 0秒-2分钟)1 0 0 .第4组微软面试题,挑战思维极限1 .1 2个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。1 3个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)(5分钟-1小时) 2 .在9个点上画1 0条直线,要求每条直线上至少有三个点?(3分钟-2 0分钟) 3 .在一天的2 4小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?(5分钟-1 5分钟)终结附加题:微软面试题,挑战你的智商=说明:如果你是第一次看到这种题,并且以前从来没有见过类似的题型,并且能够在半个小时之内做出答案,说明你的智力超常)1 .第一题 . 五个海盗抢到了1 0 0颗宝石,每一颗都一样大小和价值连城。他们决定这么分: 抽签决定自己的号码(1、2、3、4、5) 首先,由1号提出分配方案,然后大家表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔进大海喂鲨鱼 如果1号死后,再由2号提出分配方案,然后剩下的4人进行表决,当且仅当超过半数的人同意时,按照他的方案进行分配,否则将被扔入大海喂鲨鱼。依此类推 条件:每个海盗都是很聪明的人,都能很理智地做出判断,从