本系列源于:从July的470道面试题中提取腾讯的笔试题和面试题,以助应聘腾讯的同学和朋友们一臂之力。
这部分题目大多在2011~2013年左右,近两年的腾讯面试笔试题还没有,希望有的朋友能直接发我邮箱:[email protected],或者直接微信我HyperHorse,当然也可以直接在我的blog下面进行评论。当然其他互联网公司,如百度、网易、腾讯、360等等公司的笔试面试题也可以发到有的邮箱[email protected]中,我会在其他专栏中开辟对每个互联网公司面试题的专栏进行分析和整理。
凡是收集到的关于腾讯的题目均会在本Blog进行更新,希望给大家带来一些帮助,也能真正的提高自己。
能力一般,水平有限,如有错误,还希望各位朋友们能指出。
1、腾讯面试题:
给你10分钟时间,根据上排给出十个数,在其下排填出对应的十个数
要求下排每个数都是先前上排那十个数在下排出现的次数。
上排的十个数如下:
【0,1,2,3,4,5,6,7,8,9】
举一个例子,
数值: 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次....
以此类推..
ANSWER:
I don’t like brain teasers. Will skip most of them...
2、腾讯面试题:
1.设计一个魔方(六面)的程序。
ANSWER
This is a problem to test OOP.
The object MagicCube must have following features
1) holds current status
2) easily doing transform
3) judge whether the final status is achieved
4) to test, it can be initialized
5) output current status
public class MagicCube {
// 6 faces, 9 chips each face
private byte chips[54];
static final int X = 0;
static final int Y = 1;
static final int Z = 1;
void transform(int direction, int level) {
switch direction: {
X : { transformX(level); break; }
Y : { transformY(level); break; }
Z : { transformZ(level); break; }
default: throw new RuntimeException(“what direction?”);
}
void transformX(int level) { … }
}
}
// really tired of making this...
}
3、有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。
请用5分钟时间,找出重复出现最多的前10条。
ANSWER
10M msgs, each at most 140 chars, that’s 1.4G, which can fit to memory.
So use hash map to accumulate occurrence counts.
Then use a heap to pick maximum 10.
4、收藏了1万条url,现在给你一条url,如何找出相似的url。(面试官不解释何为相似)
ANSWER
What a SB interviewer... The company name should be claimed and if I met such a interviewer, I will contest to HR. The purpose of interview is to see the ability of communication. This is kind of single side shutdown of information exchange.
My first answer will be doing edit distance to the url and every candidate. Then it depends on what interviewer will react. Other options includes: fingerprints, tries...
5、在一个文件中有 10G个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。
6、一个文件中有40亿个整数,每个整数为四个字节,内存为1GB,写出一个算法:求出这个文件里的整数里不包含的一个整数
7、腾讯服务器每秒有2w个QQ号同时上线,找出5min内重新登入的qq号并打印出来。
8、腾讯1.服务器内存1G,有一个2G的文件,里面每行存着一个QQ号(5-10位数),怎么最快找出出现过最多次的QQ号。
以下是个人所建第Algorithms_12群内朋友的聊天记录:
首先你要注意到,数据存在服务器,存储不了(内存存不了),要想办法统计每一个qq出现的次数。
比如,因为内存是1g,首先你用hash的方法,把qq分配到10个(这个数字可以变动,比较)文件(在硬盘中)。
相同的qq肯定在同一个文件中,然后对每一个文件,只要保证每一个文件少于1g的内存,统计每个qq的次数,可以使用hash_map(qq, qq_count)实现。然后,记录每个文件的最大访问次数的qq,最后,从10个文件中找出一个最大,即为所有的最大。更多读者可以参见此文:海量数据处理面试题集锦与Bit-map详解 。
那若面试官问有没有更高效率的解法之类的?这时,你可以优化一下,但是这个速度很快,hash函数,速度很快,他肯定会问,你如何设计,用bitmap也行。
9、 2012年4月6日的腾讯暑期实习生招聘笔试中,出了一道与上述21题类似的题,原题大致如下:
两个数组a[N],b[N],其中A[N]的各个元素值已知,现给b[i]赋值,b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i];
要求:
1.不准用除法运算
2.除了循环计数值,a[N],b[N]外,不准再用其他任何变量(包括局部变量,全局变量等)
3.满足时间复杂度O(n),空间复杂度O(1)。
说白了,你要我求b=a[0]*a*...a[i-1]*a*a[i+1]..*a[N-1]/a,就是求:a[0]*a[1]*...a[i-1]*a[i+1]..*a[N-1]。只是我把a[i]左边部分标示为left[i],b[i]右边部分标示为right[i],而实际上完全不申请left[i],与right[i]变量,之所以那样标示,无非就是为了说明:除掉当前元素a[i],其他所有元素(a[i]左边部分,和a[i]右边部分)的积。读者你明白了么?
下面是此TX笔试题的两段参考代码,如下:
//ncicc
b[0] = 1;
for (int i = 1; i < N; i++)
{
b[0] *= a[i-1];
b[i] = b[0];
}
b[0] = 1;
for (i = N-2; i > 0; i--)
{
b[0] *= a[i+1];
b[i] *= b[0];
}
b[0] *= a[1];
from wasd6081058上面第二段代码最后一行的意义是:我们看第二个循环,从N-2到 1;再看for循环中b[0]的赋值,从N-1到2,而根据题目要求b[i] = a[0]*a[1]*a[2]...*a[N-1]/a[i],b[0]应等于a[1]*a[2]* ....a[N-1],所以这里手动添加a[1]。
此外,也有朋友在微博上:http://weibo.com/1761944724/ydwuMt9bH 给出了另外一种解法,如下图所示:
10、有不同的手机终端,如iphone,安卓,Symbian,不同的终端处理不一样,设计一种服务器和算法实现对不同的终端的处理。
11、设计一种内存管理算法。
12、设计一种算法求出算法复杂度。
13、腾讯现场招聘问题liuchen1206今天参加了腾讯的现场招聘会,碰到这个一个题目:
在一篇英文文章中查找指定的人名,人名使用二十六个英文字母(可以是大写或小写)、空格以及两个通配符组成(*、?),通配符“*”表示零个或多个任意字母,通配符“?”表示一个任意字母。
如:“J* Smi??”可以匹配“John Smith” .
请用C语言实现如下函数:
void scan(const char* pszText, const char* pszName);
注:pszText为整个文章字符,pszName为要求匹配的英文名。
请完成些函数实现输出所有匹配的英文名,除了printf外,不能用第三方的库函数等。
代码一(此段代码已经多个网友指出,bug不少,但暂没想到解决办法):
//copyright@ falcomavin && July
//updated:
//多谢Yingmg网友指出,由于之前这代码是从编译器->记事本->本博客,辗转三次而来的,
//所以,之前的代码不符合缩进规范,
//特此再把它搬到编译器上,调整好缩进后,不再放到记事本上,而是直接从编译器上贴到这里来。
//July,说明。2011.04.17。
#include
using namespace std;
int scan(const char* text, const char* pattern)
{
const char *p = pattern; // 记录初始位置,以便patten匹配一半失败可返回原位
if (*pattern == 0) return 1; // 匹配成功条件
if (*text == 0) return 0; // 匹配失败条件
if (*pattern != '*' && *pattern != '?')
{
if (*text != *pattern) //如果匹配不成功
return scan(text+1, pattern); //text++,寻找下一个匹配
}
if (*pattern == '?')
{
if (!isalpha(*text)) // 通配符'?'匹配失败
{
pattern = p; // 还原pattern初始位置
return scan(text+1, pattern); //text++,寻找下一个匹配
}
else // 通配符'?'匹配成功
{
return scan(text+1, pattern + 1); //双双后移,++
}
}
return scan(text, pattern+1); // 能走到这里,一定是在匹配通配符'*'了
}
int main()
{
char *i, *j;
i = new char[100];
j = new char[100];
cin>>i>>j;
cout<
代码二:
//qq120848369:
#include
using namespace std;
const char *pEnd=NULL;
bool match(const char *pszText,const char *pszName)
{
if(*pszName == '/0') // 匹配完成
{
pEnd=pszText;
return true;
}
if(*pszText == '/0') // 未匹配完成
{
if(*pszName == '*')
{
pEnd=pszText;
return true;
}
return false;
}
if(*pszName!= '*' && *pszName!='?')
{
if(*pszText == *pszName)
{
return match(pszText+1,pszName+1);
}
return false;
}
else
{
if(*pszName == '*')
{
return match(pszText,pszName+1)||match(pszText+1,pszName);
//匹配0个,或者继续*匹配下去
}
else
{
return match(pszText+1,pszName+1);
}
}
}
void scan(const char *pszText, const char *pszName)
{
while(*pszText!='/0')
{
if(match(pszText,pszName))
{
while(pszText!=pEnd)
{
cout<<*pszText++;
}
cout<
wangxugangzy05:
这个是kmp子串搜索(匹配),稍加改造,如 abcabd*?abe**??de这个窜,我们可以分成abcabd,?,abe,?,?,并按顺序先匹配abcabd,当匹配后,将匹配的文章中地址及匹配的是何子串放到栈里记录下来,这样,每次匹配都入栈保存当前子串匹配信息,当一次完整的全部子串都匹配完后,就输出一个匹配结果,然后回溯一下,开始对栈顶的子串的进行文中下一个起始位置的匹配。
14、腾讯面试题:A.txt和B.txt两个文件,A.txt有1亿个QQ号 , B.txt 100W个QQ号,用代码实现交、并、差。
15、腾讯:50个台阶,一次可一阶或两阶,共有几种走法(老掉牙的题了,详见微软面试100题2010版。
long long Fibonacci_Solution1(unsigned int n)
{
int result[2] = {0, 1};
if(n < 2)
return result[n];
return Fibonacci_Solution1(n - 1) + Fibonacci_Solution1(n - 2);
})。
16、腾讯面试:一个大小为N的数组,里面是N个整数,怎样去除重复,
要求时间复杂度为O(n),空间复杂度为O(1)(此题答案请见@作者hawksoft:http://blog.csdn.net/hawksoft/article/details/6867493)。
17、腾讯长沙笔试:旅行商问题。
18、10月9日,腾讯一面试题:
有一个log文件,里面记录的格式为:
QQ号: 时间: flag:
如123456 14:00:00 0
123457 14:00:01 1
其中flag=0表示登录 flag=1表示退出
问:统计一天平均在线的QQ数。
点评:类似于此文中:http://blog.csdn.net/hackbuteer1/article/details/7348968,第8题后的腾讯面试题,读者可以参看之。
19、有一亿个数,输入一个数,找出与它编辑距离在3以内的书,比如输入6(0110),找出0010等数,数是32位的。
20、每个城市的IP段是固定的,新来一个IP,找出它是哪个城市的,设计一个后台系统。
21、N个数组,每个数组中的元素都是递增的顺序,现在要找出这N个数组中的公共元素部分,如何做?注:不能用额外辅助空间。
点评:
讨论了半天:http://weibo.com/1580904460/z08mT0aFj,没个好的结果,发现还是上午想到的N个指针逐步向后移动,辅以二分,然后N路归并更靠谱,类似这里的第5题所述的办法:http://www.cnblogs.com/BeyondAnyTime/archive/2012/07/17/2593224.html。若读者有更好的思路,欢迎赐教。
22、10月14日,腾讯杭州站笔试题:
http服务器会在用户访问某一个文件的时候,记录下该文件被访问的日志,网站管理员都会去统计每天每文件被访问的次数。写一个小程序,来遍历整个日志文件,计算出每个文件被访问的访问次数
1)请问这个管理员设计这个算法
2)该网站管理员后来加入腾讯从事运维工作,在腾讯,单台http服务器不够用的,同样的内容,会分布在全国各地上百台服务器上。每台服务器上的日志数量,都是之前的10倍之多,每天服务器的性能更好,之前他用的是单核cpu,现在用的是8核的,管理员发现在这种的海量的分布式服务器,基本没法使用了,请重新设计一个算法。
23、腾讯的qq游戏当中,最多人玩的游戏就是斗地主了,每一句游戏开始时,服务器端都要洗牌,以保证发牌的时每个人拿的牌都是随机的,假设用1-54来表示54张不同的拍,请你写一个洗牌算法,保证54张牌能随机打散!
24、9月21日,腾讯2014软件开发校招-简答题-广州
点评:这里有一关于上面2题的题解:http://blog.csdn.net/thebestdavid/article/details/12056293,可以参考。
25、10月11日,腾讯web前端面试
一个数组 var arr = ['abc','ddadbc','adbdcd','abcqew'.......]长度一万, 用最有效率的方法计算出包含被元素出现最多的。
1、请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
2、两个数相乘,小数点后位数没有限制,请写一个高精度算法
3、有A、B、C、D四个人,要在夜里过一座桥。他们通过这座桥分别需要耗时1、2、5、10分钟,只有一支手电,并且同时最多只能两个人一起过桥。请问,如何安排,能够在17分钟内这四个人都过桥?
4、有12个小球,外形相同,其中一个小球的质量与其他11个不同,
给一个天平,问如何用3次把这个小球找出来,并且求出这个小球是比其他的轻还是重
5、如何求根号2的值,并且按照我的需要列出指定小数位,比如根号2是1.141我要列出1位小数就是1.1 2位就是1.14, 1000位就是1.141......等。。
6、A向B发邮件,B收到后读取并发送收到,但是中间可能丢失了该邮件,怎么设计一种最节省的方法,来处理丢失问题。
7、腾讯10.09测试笔试题:有N+2个数,N个数出现了偶数次,2个数出现了奇数次(这两个数不相等),问用O(1)的空间复杂度,找出这两个数,不需要知道具体位置,只需要知道这两个值。(@Rojay:xor一次,得到2个奇数次的数之和x。第二步,以x(展开成二进制)中有1的某位(假设第i位为1)作为划分,第二次只xor第i位为1的那些数,得到y。然后x xor y以及y便是那两个数。 )
8、tencent2012笔试题附加题
问题描述:例如手机朋友网有n个服务器,为了方便用户的访问会在服务器上缓存数据,因此用户每次访问的时候最好能保持同一台服务器。
已有的做法是根据ServerIPIndex[QQNUM%n]得到请求的服务器,这种方法很方便将用户分到不同的服务器上去。但是如果一台服务器死掉了,那么n就变为了n-1,那么ServerIPIndex[QQNUM%n]与ServerIPIndex[QQNUM%(n-1)]基本上都不一样了,所以大多数用户的请求都会转到其他服务器,这样会发生大量访问错误。
问:如何改进或者换一种方法,使得:
(1)一台服务器死掉后,不会造成大面积的访问错误,
(2)原有的访问基本还是停留在同一台服务器上;
(3)尽量考虑负载均衡。(思路:往分布式一致哈希算法方面考虑。关于此算法,
可参见此文:http://blog.csdn.net/21aspnet/article/details/5780831)
9、腾讯南京笔试题: M*M的方格矩阵,其中有一部分为障碍,八个方向均可以走,现假设矩阵上有Q+1节点,从(X0,Y0)出发到其他Q个节点的最短路径。
其中,1<=M<=1000,1<=Q<=100。
10 腾讯2011.10.15校园招聘会笔试题
1)、下面的排序算法中,初始数据集的排列顺序对算法的性能无影响的是(B)
A、插入排序 B、堆排序 C、冒泡排序 D、快速排序
2)、以下关于Cache的叙述中,正确的是(B)
A、CPU中的Cache容量应大于CPU之外的Cache容量
B、Cache的设计思想是在合理成本下提高命中率
C、Cache的设计目标是容量尽可能与主存容量相等
D、在容量确定的情况下,替换算法的时间复杂度是影响Cache命中率的关键因素
3)、数据存储在磁盘上的排列方式会影响I/O服务的性能,一个圆环的磁道上有10个物理块,10个数据记录R1------R10存放在这个磁道上,记录的安排顺序如下表所示:
物理块 |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
逻辑记录 |
R1 |
R2 |
R3 |
R4 |
R5 |
R6 |
R7 |
R8 |
R9 |
R10 |
假设磁盘的旋转速度为20ms/周,磁盘当前处在R1的开头处,若系统顺序扫描后将数据放入单缓冲区内,处理数据的时间为4ms(然后再读取下个记录),则处理这10个记录的最长时间为(C)
A、180ms B、200ms C、204ms D、220ms
4)、随着IP网络的发展,为了节省可分配的注册IP地址,有一些地址被拿出来用于私有IP地址,以下不属于私有IP地址范围的是(C)(私网IP地址:10.0.0.0- 10.255.255.255
;172.16.0.0 - 172.31.255.255;192.168.0.0-192.168.255.255。故选C)
A、10.6.207.84 B、172.23.30.28 C、172.32.50.80 D、192.168.1.100
5)、下列关于一个类的静态成员的描述中,不正确的是(D)
A、该类的对象共享其静态成员变量的值 B、静态成员变量可被该类的所有方法访问
C、该类的静态方法只能访问该类的静态成员变量 D、该类的静态数据成员变量的值不可修改
6)、已知一个线性表(38,25,74,63,52,48),假定采用散列函数h(key) = key%7计算散列地址,并散列存储在散列表A【0....6】中,若采用线性探测方法解决冲突,则在该散列表上进行等概率成功查找的平均查找长度为(C)
A、1.5 B、1.7 C、2.0 D、2.3
依次进行取模运算求出哈希地址:
A |
0 |
1 |
2 |
3 |
4 |
5 |
6 |
记录 |
63 |
48 |
|
38 |
25 |
74 |
52 |
查找次数 |
1 |
3 |
|
1 |
1 |
2 |
4 |
74应该放在下标为4的位置,由于25已经放在这个地方,所以74往后移动,放在了下标为5的位置上了。
由于是等概率查找,所以结果为:1/6*(1+3+1+1+2+4)= 2.0
7)、表达式“X=A+B*(C--D)/E”的后缀表示形式可以为(C)
A、XAB+CDE/-*= B、XA+BC-DE/*= C、XABCD-*E/+= D、XABCDE+*/=
8)、(B)设计模式将抽象部分与它的实现部分相分离。
A、Singleton(单例) B、 Bridge(桥接)
C、 Composite(组合) D、 Facade(外观)
9)、下面程序的输出结果为多少?
void Func(char str_arg[100])
{
printf("%d\n",sizeof(str_arg));
}
int main(void)
{
char str[]="Hello";
printf("%d\n",sizeof(str));
printf("%d\n",strlen(str));
char *p = str;
printf("%d\n",sizeof(p));
Func(str);
}
输出结果为:6 5 4 4
对字符串进行sizeof操作的时候,会把字符串的结束符“\0”计算进去的,进行strlen操作求字符串的长度的时候,不计算\0的。
数组作为函数参数传递的时候,已经退化为指针了,Func函数的参数str_arg只是表示一个指针,那个100不起任何作用的。
10)、下面程序的输出结果为多少?
void Func(char str_arg[2])
{
int m = sizeof(str_arg); //指针的大小为4
int n = strlen(str_arg); //对数组求长度,str_arg后面的那个2没有任何意义,数组已经退化为指针了
printf("%d\n",m);
printf("%d\n",n);
}
int main(void)
{
char str[]="Hello";
Func(str);
}
输出结果为: 4 5
strlen只是对传递给Func函数的那个字符串求长度,跟str_arg中的那个2是没有任何关系的,即使把2改为200也是不影响输出结果的。。
11)、到商店里买200的商品返还100优惠券(可以在本商店代替现金)。请问实际上折扣是多少?
算法编程题:
12)、给定一个字符串,求出其最长的重复子串。
思路:使用后缀数组,对一个字符串生成相应的后缀数组后,然后再排序,排完序依次检测相邻的两个字符串的开头公共部分。
这样的时间复杂度为:
生成后缀数组 O(N)
排序 O(NlogN*N)最后面的 N是因为字符串比较也是 O(N)
依次检测相邻的两个字符串 O(N * N)
总的时间复杂度是 O(N^2*logN),
13)
选择题:
1)、下列RAID技术无法提高可靠性的是:
A:RAID0 B:RAID1 C:RAID10 D:RAID5
2)、长度为1的线段,随机在其上选择两点,将线段分为三段,问这3个字段能组成一个三角形的概率是:
1/2,1/3,1/4,1/8
3)、下面那种标记的包不会在三次握手的过程中出现()
A:SYN B:PSH C:ACK D:RST