面试题集及解答
文章平均质量分 65
面试是每个程序员都面对的过程,这个专栏是收集网上的面试题,及自己被面或者面试别人的题,给出解答和实现。每个实现都经过了验证。提高自己的同时也希望与伙伴们分享。
3h随然吧
热爱生活,钻研技术
展开
-
51. 腾讯面试题:一个二叉树,中序遍历,找一个节点的后一个节点
题目:一个二叉树,中序遍历,找一个节点的后一个节点原创 2014-08-19 10:50:24 · 2359 阅读 · 7 评论 -
50. 腾讯面试题:两个单链表相交,求开始相交的点
腾讯面试题:两个链表相交,求开始相交的点腾讯的技术面试很喜欢问算法类的问题,准备去腾讯面试前,要好好看下算法的东西。这题如果求两个链表是否相交,或者求相交的终点好求,要求开始相交的点,不好求。刚开始我的思路一直停留再相交的终点做文章,比如,1)知道终点,就知道终点的上一个点,判断它是不是,再找上上一个点,以此类推。。。可惜这是个单链表,不能逆向遍历。 使用这原创 2014-08-15 23:26:51 · 2839 阅读 · 0 评论 -
49. 搜狗面试题: 大数相乘算法
分析:大数能大到整形类型存储不了,需要借助于其他的算法,来完成乘法运算。可以使用口算乘法的步骤来模拟乘法操作,如下: 123 * 122= 3 4 6 + 3 4 6 +原创 2014-08-07 16:17:00 · 1557 阅读 · 0 评论 -
48. 搜狗面试题:从尾到头输出链表
题目:输入一个链表(无环单链表)的头结点,从尾到头反过来输出每个结点的值。链表结点定义如下:typedef struct listNode{ struct listNode* next; int data;}Node;分析:这题我有两种思路,一种:是常规思路,把链表逆过来,再遍历。还有一种:借助于栈来实现(使用栈的先进后出的特点)。不过后原创 2014-06-07 18:44:29 · 943 阅读 · 0 评论 -
47. 腾讯面试题: 用两个栈实现队列
题目:某队列的声明如下:templateclass Stack;templateclass CQueue{public: CQueue(){} ~CQueue(){} void appendTail(const T& node); void deleteHead(); void pop(T& n原创 2014-06-06 22:49:15 · 1079 阅读 · 0 评论 -
46. 谷歌面试题:寻找丑数
题目:我们把只包含因子2、3和5的数称作丑数(Ugly Number)。例如6、8都是丑数,但14不是,因为它包含因子7。习惯上我们把1当做是第一个丑数。求按从小到大的顺序的第1500个丑数。分析:这是一道在网络上广为流传的面试题,据说google曾经采用过这道题。这段题刚开始的想法是从1开始递增遍历,找出1500个是丑数的数,并打印出来。实现如下:原创 2014-06-04 07:59:39 · 1545 阅读 · 15 评论 -
45. 腾讯面试题: 使用hashmap 插入数据,怎么样按照插入数据的顺序输出数据
题目:使用hashmap 插入数据,怎么样按照插入数据的顺序输出数据分析:使用hashmap插入数据,数据的顺序会改变。可以写个小程序试试。那怎么样按照插入的顺序输出呢?方法一:这是我第一时间想出来的办法: 维护一张表,存储数据插入的顺序,可以使用vector。但是如果删除数据呢,首先得在vector里面找到那个数据,再删除,而删除又要移动大量数据。性能效率很低原创 2014-05-28 23:08:56 · 5074 阅读 · 0 评论 -
44. 腾讯面试题: 使用函数的参数指针,分配内存空间问题
面试官写了一段程序:void fun(int* a){ a = new int[100]; cout << a << endl;}int main(){ int *a; fun(a); a[1]= 0; fun(a);}这个程序有问题吗?答: 有问题。原创 2014-05-28 20:21:30 · 2490 阅读 · 0 评论 -
43. 百度面试题:最长公共子序列
题目:如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串二中,则字符串一称之为字符串二的子串。注意,并不要求子串(字符串一)的字符必须连续出现在字符串二中。请编写一个函数,输入两个字符串,求它们的最长公共子串,并打印出最长公共子串。例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA和BDAB都是是它们的最长公共子串,则输出它们的长度4,并打印任意一个子串。原创 2014-05-21 20:26:05 · 1008 阅读 · 0 评论 -
42. 微软面试题:调整数组顺序使奇数位于偶数前面(数组)
题目:输入一个整数数组,调整数组中数字的顺序,使得所有奇数位于数组的前半部分,所有偶数位于数组的后半部分。要求时间复杂度为O(n)。分析:只需要设置头尾两个指针遍历就可以了,前面遇到偶数记下来,后面遇到奇数记下来,交换,知道后面的指针小于前面的指针。实现如下:#include#include#include#include#include原创 2014-05-15 20:19:03 · 1290 阅读 · 0 评论 -
41. 百度面试题:字符串的排列(字符串)
题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a, b, c 所能排列出来的所有字符串abc, acb, bac, bac, cab和cab。分析:这题主要考递归思想。依次取出每个字符,剩下的字符的字符串所有排列都打印出来,再加上开始的字符。实现:#include#include#include#inclu原创 2014-05-14 23:18:14 · 1042 阅读 · 2 评论 -
40. 网易面试题:和为n连续正数序列(数组)
网易面试题:和为n连续正数序列(数组)题目:输入一个正数n,输出所有和为n连续正数序列。例如:输入15,由于 1+ 2 + 3 + 4 +5 = 4 + 5 + 6 = 7 + 8 = 15, 所以输入3个连续序列1,2,3,4,5 和 4,5,6 和7,8。分析:找连续序列可以从2个开始找,再找3个,4个等等,那到什么时候结束呢?当发现找到的原创 2014-05-14 20:06:14 · 1033 阅读 · 0 评论 -
39. 腾讯面试题:有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。
有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条。分析:常规方法是先排序,在遍历一次,找出重复最多的前10条。但是排序的算法复杂度最低为nlgn。可以设计一个hash_table, hash_map,依次读取一千万条短信,加载到hash_table表中,并且统计重复的次数,与此同时维护一张最多10条的短信表。这样原创 2014-04-05 07:40:18 · 7645 阅读 · 16 评论 -
38. 2014年4月1日的360搜索广告部面试题
360的总部在北京望京798附近,这周有朋友去面试了,讲了下大致过程。360总部一楼有个大厅,前台有很多MM,说明来意,被指向面试区(人还挺多的,应该很缺人,或者有新项目)。一面:技术面,是个小弟面的。1)介绍下自己2)说了几个重要的项目,问了些项目的情况,这都是面试官感兴趣的话题。3)出了个编程题:设计一个trie树,实现创建 trie树和检索功能,数据为原创 2014-04-05 00:41:00 · 2105 阅读 · 0 评论 -
37. 20140329 蓝汛社招面试题
今天有朋友去蓝汛通讯技术面试云平台的后端开发,目前云平台还是个新部门,在大规模的招聘中,今天就有一轮大规模招聘。当然我不知道什么时候开始,什么时候结束l了,哈哈!就面了两面,下面介绍下大概的面试题目:一面1. 介绍下你做的项目。介绍完后,面试官就问些项目的情况,他所感兴趣的方面?答: 这个问题社招一般都会问到,一般我公司面试的时候,我也会问,一是了解下对方的背景,二是原创 2014-03-30 19:42:42 · 2531 阅读 · 1 评论 -
36. 微软面试题:请修改append函数, 利用函数实现(链表)
题目:请修改append函数,利用这个函数实现:两个非降序链表的并集,1->2->3 和 2->3->5 并为 1->2->3->5另外只能输出结果,不能修改两个链表的数据。分析:这题很简单,两个指向链表的指针,比较对应的值,并遍历实现如下:#includeusing namespace std;struct Node{ No原创 2014-03-27 00:01:57 · 1548 阅读 · 0 评论 -
35. 百度研发笔试题:设计一个系统处理词语搭配问题
题目:设计一个系统处理词语搭配问题,比如说 中国 和人民可以搭配,则中国人民 人民中国都有效。要求: *系统每秒的查询数量可能上千次; *词语的数量级为10W; *每个词至多可以与1W个词搭配当用户输入中国人民的时候,要求返回与这个搭配词组相关的信息。分析:性能要求:每秒查询量达到上千次,意思就是QPS要达到1000以上。搜索端使用原创 2014-03-26 22:55:10 · 2714 阅读 · 0 评论 -
34. 百度研发笔试题: 一串首尾相连的珠子(m个),有N种颜色(N<=10)
题目:一串首尾相连的珠子(m个),有N种颜色(N设计一个算法,取出其中一段,要求包含所有N中颜色,并使长度最短。并分析时间复杂度与空间复杂度。分析:使用一个额外的数组存储颜色计数: colors[N],并且定义一个颜色个数遍历int cn=0;使用数组a[m]表示首尾相连的珠子。遍历数组a,统计对应的颜色,如果等于颜色的个数等于N,记录下开始位置i,和结束位原创 2014-03-26 20:34:43 · 2455 阅读 · 1 评论 -
33. 百度面试题:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入 流中随机取得m个记录
题目:有一个很大很大的输入流,大到没有存储器可以将其存储下来,而且只输入一次,如何从这个输入流中随机取得m个记录分析:这题在soso面试的时候也见过,当时没有答出来。现在也每想出好的办法。网上看到一种方法:每次输入一个记录时,随机产生一个0到1之间的随机数,用这些随机数维护一个大小为m的堆。但是这种方法是否是后面的输入的纪录被选取的概率要比前面要原创 2014-03-22 18:23:41 · 2527 阅读 · 12 评论 -
32. 百度面试题:用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x次天平,最多可以从y个小球中找出较轻的那个,求y与x的关系式
题目:用天平(只能比较,不能称重)从一堆小球中找出其中唯一一个较轻的,使用x次天平,最多可以从y个小球中找出较轻的那个,求y与x的关系式。分析:这题我面试得时候碰到过,不知是腾讯的面试,还是百度的面试,那个题比较具体,比如有10个球,最少需要几次能找到最轻的球。之前的相法是分成两拨,称称,轻的球肯定在轻的那拨里面,这样二分直到找到那个轻的球。后面在网上看到还有更原创 2014-03-22 18:16:43 · 6353 阅读 · 0 评论 -
31. 百度面试题:有n个长为m+1的字符串
题目:有n个长为m+1的字符串, 如果某个字符串的最后m个字符与某个字符串的前m个字符匹配,则两个字符串可以联接,问这n个字符串最多可以连成一个多长的字符串,如果出现循环,则返回错误分析:题外话:这段时间以来,做了30多面试题,现在越来越有感觉,对题的思路越来越清晰,并且很多基本的数据结果和算法都比较熟。继续做下去,为了心中的梦想。。。这题可以联想到有向图的概念,字原创 2014-03-22 09:02:11 · 1538 阅读 · 0 评论 -
30. 谷歌面试题:n支队伍比赛,分别编号为0,1,2。。。。n-1
题目:n支队伍比赛,分别编号为0,1,2。。。。n-1,已知它们之间的实力对比关系,存储在一个二维数组w[n][n]中,w[i][j] 的值代表编号为i,j的队伍中更强的一支。所以w[i][j]=i 或者j,现在给出它们的出场顺序,并存储在数组order[n]中,比如order[n] = {4,3,5,8,1......},那么第一轮比赛就是 4对3, 5对8。.......胜原创 2014-03-21 23:43:37 · 2140 阅读 · 0 评论 -
29. 微软面试题:求一个矩阵中最大的二维矩阵(元素和最大)
题目:求一个矩阵中最大的二维矩阵(元素和最大).如:1 2 0 3 42 3 4 5 11 1 5 3 0中最大的是:4 55 3要求:(1)写出算法;(2)分析时间复杂度;(3)用C写出关键代码分析:直接遍历二维数组,求出最大的二维数组就OK了实现如下:#includeusing namespace std;int max_ma原创 2014-03-20 23:27:36 · 1278 阅读 · 0 评论 -
28. 微软面试题:使用多线程实现一个队列
题目:实现一个队列队列的应用场景为:一个生产者线程将int类型的数入列,一个消费者线程将int类型的数出列。分析:首先得设计一个队列,并且最好是循环队列,否则队列里面的空间很容易一下就使用完了。题目要求使用生产者线程和消费者线程,所以得设计成线程保护,否则取数据和推送数据很容易搞错。可以使用线程的互斥变量:pthread_mutex_t加pthread_mutex_原创 2014-03-20 21:06:04 · 1589 阅读 · 0 评论 -
27. 微软面试题:实现一个挺高级的字符匹配算法
题目:给一串很长字符串,要求找到符合要求的字符串,例如目的串:1231******3***2 ,12*****3这些都要找出来其实就是类似一些和谐系统。。。。。分析:自然匹配就是对待匹配的每个字符挨个匹配设你的待匹配字串长度位n,模式字符串长度位m.对于待匹配字符串中的任意一个字符最坏情况下要匹配m次,也就是说这个字符不在模式字符串中。所以最坏情况下总共是m*n原创 2014-03-15 23:16:16 · 1122 阅读 · 0 评论 -
26. Google面试题:从1到n的整数中1出现的次数
题目:输入一个正整数n,求从1到n这n个整数的十进制表示1出现的次数。例如:例如输入12, 那么从1到12的整数中出现1的整数为:1,10, 11和12,1一共出现5次。分析:这题可以简单计算每个数中包含的1的个数,再遍历1-n个整数。当然也可以分析1出现的规律。各个位出现1的次数只有一次,因为个位数的范围为:1,2,。。。,9.1 102030原创 2014-03-15 18:47:53 · 969 阅读 · 0 评论 -
25. 微软面试题:栈的push、pop序列(栈)
题目:输入两个整数序列。其中一个序列表示栈的push顺序,判断另一个序列有没有可能是对应的pop顺序。为了简单起见,我们假设push序列的任意两个整数都是不相等的。比如:输入的push序列是1,2,3,4,5 ,那么4,5,3,2,1就有可能是一个pop序列。因为可以有如下的push和pop序列:push 1, push 2, push 3, push 4, pop原创 2014-03-15 11:55:14 · 1318 阅读 · 0 评论 -
24. 微软面试题:整数的二进制表示中1的个数
题目:输入一个整数,求该整数的二进制表达中有多少个1。例如输入10,由于其二进制表示为1010,有两个1,因此输出2。分析:使用移位操作,来实现。具体实现如下:#includeusing namespace std;int binary1num(int d){ int cnt = 0; while(d/2 != 0)原创 2014-03-13 23:01:56 · 983 阅读 · 0 评论 -
23. 微软面试题:跳台阶问题
题目:一个台阶总共有n级,如果一次可以跳1级,也可以跳2级。求总共有多少总跳法,并分析算法的时间复杂度。分析:采用递归思想,从第n个台阶开始研究,第 n 个台阶有两种跳法,一种是跳一级,还有 n -1级台阶要跳,另一种是跳两级,还有n -2级需要跳。公式如下:f(n) = f(n-1) + f(n-2),其中 f(1) = 1, f(2) = 2。实现原创 2014-03-13 22:49:29 · 886 阅读 · 0 评论 -
22. 微软面试题:左旋字符串
题目:定义字符串的左旋转操作:把字符串前面的若干个字符移动到字符串的尾部。例如把字符串"abcdef" 左旋2位 得到字符串“cdefab"。请实现字符串左旋转的函数。要求时间对长度n的字符串操作的复杂度位O(n),辅助内存为O(1).分析:这题的难点是辅助内存只能只用O(1),相当于只能进行字符串中字符的替换操作,如果需要移动字符串,则需要m*n次替换操作,这样复杂度原创 2014-03-13 22:29:35 · 815 阅读 · 0 评论 -
21. 微软面试题:字符串中找最长数字字符串
题目:在字符串中找出连续最长字符串,并把这个串的长度返回。例如:字符串“abcd12345ed125ss123456789”,他的最长字符串为“123456789“,长度为9.实现如下:#include#include#includeusing namespace std;int continumax(char *outputstr,char *intputs原创 2014-03-13 21:41:24 · 852 阅读 · 0 评论 -
20. 微软面试题:单链表就地逆置
题目是:链表操作,单链表就地逆置分析:这题只需要设置三个指针就搞定了,ListNode* p 表示当前指针, ListNode* fp: 上一个节点指针, ListNode * ep :下一个节点指针p ->next = fp;fp = p;p = ep ep = p->next;具体实现如下:#includeusing namespace st原创 2014-03-13 01:16:19 · 1263 阅读 · 0 评论 -
19. 中兴面试题:输入两个整数n和m, 从数列1,2,...,n中任意选择几个数,使其和等于m, 要求编写程序输出所有的组合
2010年中兴面试题编程求解:输入两个整数 n 和 m,从数列1,2,3.......n中随意取几个数,使其和等于 m ,要求将其中所有的可能组合列出来.分析:可以使用递归思想, 从第n个数开始找其组合,1)包括n的所有组合2)不包括n的所有组合把所有组合整合起来就OK了。下面来看具体的实现:#include#include#in原创 2014-03-12 13:32:22 · 2901 阅读 · 0 评论 -
18. 微软面试题:输入一个表示整数的字符串,把该字符串转换成整数并输出
题目:输入一个表示整数的字符串,把该字符串转换成整数并输出。例如输入字符串"345",则输出整数345。分析:可以直接使用atoi函数, 但这个题目显然不希望你这么做我们还是按照常规方法来做,比如整数字符串长度为n= strlen(str)。最右边的为个数,往左依次是十位,百位等。右边---左边0 1 2 ...比原创 2014-03-11 20:33:39 · 2178 阅读 · 0 评论 -
17. 微软面试题:用最快的方法计算出 Fibonacci数列中的第n项
这题可以参考Zyearn的博客(斐波那契数列的几种计算机解法):http://blog.csdn.net/zyearn/article/details/7878657使用通项公式的方式,算法复杂度为o(1),应该是最快的。先看下Fibonacci数列的定义:使用通项公式的概念,可以得到:使用矩阵计算可以得到:原创 2014-03-11 20:03:40 · 3472 阅读 · 1 评论 -
16. 微软面试题:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始
题目:n个数字(0,1,…,n-1)形成一个圆圈,从数字0开始,每次从这个圆圈中删除第m个数字(第一个为当前数字本身,第二个为当前数字的下一个数字)。当一个数字删除后,从被删除数字的下一个继续删除第m个数字。求出在这个圆圈中剩下的最后一个数字。分析:最初的想法是想设计一个数据结构,实现随机存取,又能快速删除的数据结构。最开始想到的是循环数组,发现删除不好处理,得移动原创 2014-03-10 23:55:42 · 1327 阅读 · 0 评论 -
15. Google面试题:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b
题目:在一个字符串中找到第一个只出现一次的字符。如输入abaccdeff,则输出b。分析:一般方法是使用每个字符间都比较一次,算法复杂度为o(n^2)可以使用空间换时间的方法,字符在ASCII码的表示范围内(0~256),使用捅排序思想。使用int str[256] 表示256个字符在此字符串中出现的次数,遍历一次就能统计出字符的出现次数。再找出次数为1的第一个原创 2014-03-09 13:35:11 · 2097 阅读 · 0 评论 -
14. 微软面试题:输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。
题目(微软):输入一颗二元树,从上往下按层打印树的每个结点,同一层中按照从左往右的顺序打印。 例如输入 8 / / 6 10/ / / /5 7 9 11输出86 10 5 7 9 11。这题在我前面的题目中已经实现过了,现在贴过来用用。#includeusing namespace std;struct BTree{原创 2014-03-09 11:15:32 · 1166 阅读 · 0 评论 -
13. 微软面试题:题目:输入一颗二元查找树,将该树转换为它的镜像
题目:输入一颗二元查找树,将该树转换为它的镜像,即在转换后的二元查找树中,左子树的结点都大于右子树的结点。用递归和循环两种方法完成树的镜像转换。 例如: 8 / / 6 10 // //5 7 9 11输出: 8 / / 10 6 // //11 9 7 5分析:可以使用递归思想,BTree* root ;原创 2014-03-09 11:10:15 · 1411 阅读 · 0 评论 -
12. 微软面试题:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字
题目:输入一个已经按升序排序过的数组和一个数字,在数组中查找两个数,使得它们的和正好是输入的那个数字。要求时间复杂度是O(n)。如果有多对数字的和等于输入的数字,输出任意一对即可。分析:通过设置数组首尾指针,i = 0, j = len -1, 因为数组是有序的,当array[i] + array[j] 大于给定的数字value时,j -- ,如果小于, i++原创 2014-03-09 10:44:21 · 2313 阅读 · 0 评论