网易、百度等公司面试题整理

1、n是一个奇数,求证n(n^2-1)能被24整除(网易)

n=2*k+1;那么n(n^2-1)=4*k(k+1)*(2k+1)=4*6*(1^2+...+k^2),显然能被24整除。

2、do...while和while...do有什么区别(华为)

前者先执行一遍循环体,在进行条件判断;后者先进性判断,然后根据判断结果来决定是否执行;所以前者的循环体至少执行一次。

3、两个整数集合A和B,求其交集(腾讯)

构造一个map,遍历A中的元素,插入到map中;然后遍历B中的元素,看是否在map中出现。

4、如何引用一个已经定义过的全局变量(华为)

可以引用头文件的方式,也可以使用extern关键字;两者的区别在于,如果变量出错了,那么前者将会在编译期间报错,而后者则会等到连接期间报错

5、甲乙丙丁4个人轮流顺序抽签(共4张签)。任何第一个抽中“请客”的人即请大家吃饭。假设:
A) 4张签中共有1张请客的签;
B) 4张签中共有2张请客的签;
C) 4张签中共有3张请客的签;
请问A)、B)、C)三种情况下甲乙丙丁每个人请大家吃饭的概率分别有多大?(迅雷)

A) 第一个人请客的概率 1/4;第二个人请客的概率是 3/4 * 1/3 = 1/4;第三个人请客的概率是 3/4 * 2/3 * 1/2 = 1/4;第四个人请客的概率是 3/4 * 2/3 * 1/2 * 1 = 1/4。
B) 第一个人请客的概率是 2/4 = 1/2;第二个人请客的概率是 2/4 * 2/3 = 1/3;第三个人请客的概率是 2/4 * 1/3 = 1/6;第四个人请客的概率是 0。
C) 第一个人请客的概率是 3/4;第二个人请客的概率是 1/4;第三四个人请客的概率是0。(跟自己想的出入挺大,自己少考虑了比较多的情况)


6、n个空间(其中n<1M),存放a到a+n-1的数,位置随机且数字不重复,a为正且未知。现在第一个空间的数被误设置为-1。已经知道被修改的数不是最小的。请找出被修改的数字是多少。
例如:n=6,a=2,原始的串为5, 3, 7, 6, 2, 4。现在被别人修改为-1, 3, 7, 6, 2, 4。现在希望找到5。(百度)

这个题如果能弄懂题目意图的话,貌似没什么难得;答案奉上:

由于修改的数不是最小的,所以遍历第二个空间到最后一个空间可以得到a的值。
a 到 a+n-1这 n个数的和是 total = na + (n - 1)n/2。
将第二个至最后一个空间的数累加获得 sub_total。
那么被修改的数就是 total - sub_total。(或许应该考虑相加溢出的情况,故应该采用边加边减的方式,或者整体减去a的值,在进行后续计算)

7、兄弟该如何分钱:

妈妈有2000元,要分给她的2个孩子。由哥哥先提出分钱的方式,如果弟弟同意,那么就这么分。但如果弟弟不同意,妈妈会没收1000元,由弟弟提出剩下 1000元的分钱方式,这时如果哥哥同意了,就分掉这剩下的1000元。但如果哥哥也不同意,妈妈会把剩下的1000元也拿走,然后分别只给他们每人100元。问:如果你是哥哥,你会提出什么样的分钱方式,使你有可能得到最多的钱?(最小单位1元)(IBM)

只要模仿海盗分金问题,采用从后往前推的思路就可以了,比较简单。

哥哥提出分配方案时,弟弟是否同意取决于拒绝后是否可以获得更多利益。弟弟分配时,哥哥是否同意也取决于拒绝后是否可以获得更多好处。所以采取由后向前推导的方法。如果在两次分配中弟弟和哥哥都不同意,则弟弟和哥哥各获得100元。弟弟分钱时,为保证哥哥同意,会提出哥哥101元,弟弟899元的分配方法。因为哥哥获得了比拒绝后的更多利益,所以必然会同意。哥哥分钱时,为保证弟弟同意,会提出哥哥1100元,弟弟900元的分配方法。因为弟弟获得了比拒绝后的更多利益,所以必然会同意。也就是说,最终哥哥会提出哥哥1100元,弟弟900元的分配方法。

8、在一个重男轻女的国家里,每个家庭都想生男孩,如果他们生的孩子是女孩,就再生一个,直到生下的是男孩为止。这样的国家,男女比例会是多少?(Google)

我的答案是1:1,或者说接近于1:1,;可以考虑采用数学的方法,对与一个家庭,如果说有N个小孩,则会出现如下情况:

1/2 N=1:1个男孩

1/4 N=2:1个男孩,1个女孩

1/2^n N=n:1个男孩,(n-1)个女孩

我们统计Boy(n)近似为1,Girl(n)=1-(n-1)/2^n,数学上来说当n比较大时,接近于1:1;但是现实生活中n都不是太大,并且人为流产(人工干预)等因素,造成生男生女的概率不相等,所以也就出现了性别失调。

9、随机洗牌问题;给出一种模拟方法,使得洗牌的结果比较随机;(微软)

1. for i:=1 to n do swap(a[i], a[random(1,n)]); // 凑合,但不是真正随机
2. for i:=1 to n do swap(a[i], a[random(i,n)]); // 真正的随机算法
其中,random(a,b)函数用于返回一个从a到b(包括a和b)的随机整数。
2)的时间复杂度O(n), 空间复杂度O(1);

参见:
http://hi.baidu.com/wulei407/blog/item/b6ea451b6572f9fdaf513315.html

http://hi.baidu.com/zhaolijun08/blog/item/9b4cfa944472521dd31b7043.html

10、在100w个数中找最大的前100个数(百度)

应该使用某种数据结构保存迄今最大的100个数。每读到一个新数时,将新数和保存的100个数中的最小一个相比较,如果新数更大些,则替换。这样扫描一遍100w个数也就获得了最大的100个数。
对于保存的100个数的数据结构,应该在最小复杂度的条件下满足
1)可以获得最小的数;
2)将最小数替换为另一个数后可以重新调整,使其可以满足条件1。
可见小根堆可以满足这些条件。
所以应该采用小根堆+扫描的方法。

11、正向最大匹配分词,怎么做最快?(百度)

Trie树(有待进一步研究)

12、session和cache的区别是什么?(百度)

session是针对单个连接(会话)来使用的,主要存储和连接相关的上下文信息,比如登录信息等等。
cache是应用程序级的,主要用来缓存计算结果,减轻服务器负担,并加快响应速度。

13、session和cookie的区别?

由于http是无状态的协议,所以我们需要使用cookie和session来维护服务器和客户端交互过程中的上下文信息。
cookie是存储在客户端的数据。服务器通过在http响应头,或者通过网页中的脚本在客户端中生成cookie。当客户端访问某个页面时,会把符合条件的cookie一并传送给服务器。这样服务器就可以获得以前记录的状态了。
session是存储在服务器端以sessionid作为key数据。服务器通过cookie(或者在url加入sessionid信息)将sessionid传给客户端,当客户端再次请求时,服务端就可以识别这个sessionid,并获得相应的上下文信息了

cookie 和session 的区别:
1、cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗
考虑到安全应当使用session
3、session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能
考虑到减轻服务器性能方面,应当使用COOKIE
4、单个cookie在客户端的限制是3K,就是说一个站点在客户端存放的COOKIE不能3K

14、疯子坐飞机问题

飞机上有100个座位,按顺序从1到100编号。有100个乘客,他们分别拿到了从1号到100号的座位,他们按号码顺序登机并应当对号入座,如果 他们发现对应号座位被别人坐了,他会在剩下空的座位随便挑一个坐。现在假如1号乘客疯了 -_-! (其他人没疯),他会在100个座位中随机坐一个座位。那么第100人正确坐自己座位的概率是多少? 注意登机是从1到100按顺序的。

假设飞机上只有两个座位,那么显然第二个人有50%的概率坐在自己的座位上。
假设飞机上只有三个座位,如果1号坐了自己的座位,则3号会坐在自己的座位上;如果1号坐了3号的座位,则3号不能坐到自己的座位上;如果1号坐了2号的座位,则对于3号来说,效果和2号应该坐到1号座位上,但他会随机坐相同,也就是等价于1号没疯,2号疯了,根据上面只有两个座位时的情况,知道这种情况下3号有50%的概率坐到自己的座位上。所以总体来说3号有50%的概率坐到自己的座位上。
.....
以此类推,可以知道当有100个座位时,100号坐到自己座位上的概率为50%

15、谁能先说出总和为100的数(迅雷)

甲乙两人,玩一个游戏。每人轮流说出1-10的一个数字,从甲开始。轮到某个人,使得所有说出的数字的总和等于100,就算谁赢。
请问甲或乙谁有必胜的把握,为什么?

先假设X必胜,Y必输。
那么不论Y最后说出的数字是1还是10,X都能说出一个数使得总数为100。可以推出Y最后一次说之前的总和为89。
同理可以推出Y倒数第二次说之前总和为78。
依次类推,可以知道Y说之前的数字分别为1,12,23 ... 78, 89。
可以看出X就是甲。他的策略就是,先说出1,然后乙说出数字n,甲就说11-n

16、将query按照出现的频度排序(10个1G大小的文件)(百度)
有10个文件,每个文件1G,每个文件的每一行都存放的是用户的query,每个文件的query都可能重复。如何按照query的频度排序?

1)读取10个文件,按照hash(query)%10的结果将query写到对应的文件中。
这样我们就有了10个大小约为1G的文件。任意一个query只会出现在某个文件中。
2)对于1)中获得的10个文件,分别进行如下操作
- 利用hash_map(query,query_count)来统计每个query出现的次数。
- 利用堆排序算法对query按照出现次数进行排序。
- 将排序好的query输出的文件中。
这样我们就获得了10个文件,每个文件中都是按频率排序好的query。
3)对2)中获得的10个文件进行归并排序,并将最终结果输出到文件中。
注:如果内存比较小,在第1)步中可以增加文件数。

17、有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?(腾讯)

申请10w个bit的空间,每个bit代表一个数字是否出现过。
开始时将这10w个bit都初始化为0,表示所有数字都没有出现过。
然后依次读入已经打乱循序的数字,并将对应的bit设为1。
当处理完所有数字后,根据为0的bit得出没有出现的数字。

18、在1亿条用户记录里,如何快速查询统计出看了5个电影以上的用户?(迅雷)

构建一个hash map,key为用户名,value为已经看过的电影数量。
遍历所有用户记录,然后根据用户名和已经看过电影数量的情况进行处理:
- 如果用户名不在hash map中,则添加对应用户名,并将值设为1。
- 如果用户名对应的值小于5,则将值加1。如果加1后值为5,则输出此用户名。
- 如果用户名对应的值等于5,则不进行任何操作。

19、如果在高速公路上30分钟内看到一辆车开过的几率是0.95,那么在10分钟内看到一辆车开过的几率是多少?(假设为常概率条件下)(Google)

假设10分钟内看到一辆车开过的概率是x,那么没有看到车开过的概率就是1-x,30分钟没有看到车开过的概率是(1-x)^3,也就是0.05。所以得到方程
(1-x)^3 = 0.05 解方程得到x大约是0.63

20、有25匹马,每次比赛只能有5匹马参加,问最少进行几次比赛才可以得到25匹马中跑得最快的前3名?(Google)

最少需要7次。
首先将马分成a,b,c,d,e 5个组,每组5匹,每组单独比赛。然后将每组的第一名放在一起比赛。假设结果如下
a0,a1,a2,a3,a4
b0,b1,b2,b3,b4
c0,c1,c2,c3,c4
d0,d1,d2,d3,d4
e0,e1,e2,e3,e4
其中a, b,c,d,e小组都是按照名次排列(速度a0>a1>a2>a3>a4, b0>b1....)。并第6次比赛的结果为a0>b0>c0>d0>e0。
那么第6次比赛结束后,我们知道最快的一匹为a0。
我们知道第2名的马一定是a1或者b0,所以在接下来的比赛中要包含这两匹马。如果a1快,那么第3名是a2或者b0,如果b0快,那么第3名是a1,b1或者c0。也就是说第2名和第3名一定在a1,a2,b0,b1和c0当中,所以在第7场比赛中包括这5匹马就可以得到第2名和第3名。
所以7次比赛就可以获得前3名的马。

21、根据上排给出十个数,在其下排填出对应的十个数, 要求下排每个数都是上排对应位置的数在下排出现的次数。上排的数: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

22、ibm面试题:只有三只酒杯,如何将酒平均分给4个人喝?(IBM)

总共16两酒,4个人喝,平均每人喝4两。
假设下面的三个数是8两,8两和4两酒杯中的酒。
8 8 0
8 5 3
第一个人先喝3两,变成
8 5 0
8 2 3
第二个人先喝2两,变成
8 0 3
8 3 0
5 3 3
5 6 0
2 6 3
2 8 1
第一个人再喝1两,就刚刚喝了4两,变成
2 8 0
0 8 2
0 7 3
3 7 0
3 4 3
6 4 0
6 1 3
第三个人先喝1两,变成
6 0 3
8 0 1
第四个人先喝1两,变成
8 0 0
5 0 3
第三个人再喝3两,就刚刚喝了4两,变成
5 0 0
2 0 3
第二个人再喝2两,就刚刚喝了4两,变成
0 0 3
第四个人再喝3两,就刚刚喝了4两

23、16个硬币,A和B轮流拿走一些,每次拿走的个数只能是1,2,4中的一个数。谁最后拿硬币谁输。
问:A或B有无策略保证自己赢?

B可以保证自己赢。
如果A拿1个,则B拿2个;如果A拿2个,则B拿1个;如果A拿4个,则B拿2个。这样每次AB加起来都是3或者6,所以最后会剩下1个或4个。如果是1个则A直接输了;如果剩下4个,A全拿则输了,如果不全拿,B继续采取上面的策略,最后还是剩下1个,还是A输。

24、网易面试题:警长,逃犯和黑白帽的问题

有一位警长,抓了三个逃犯。现警长决定给他们一次机会。他拿出3顶黑帽子,两顶白帽子,然后往这三个逃犯头上每人戴了一顶帽子,每个逃犯只能看到另外两个逃犯帽子的颜色,不能看到自己帽子的颜色,而且不能进行通讯,不能进行讨论,只能靠自己的推理推出来,如果猜出来了,放一条生路,否则处死。
警长先问第一逃犯,结果第一逃犯猜错了,被杀掉了。
警长问第二个逃犯,结果还是猜错了,同样被杀掉了。
警长再问第三个逃犯,结果第三个逃犯猜对了。
说明一下,每个逃犯在回答问题时,其他逃犯是听不到的。
为什么第三个一定能猜中,请你给出解释。

如果第二个和第三个人都是白帽子,则第一个人肯定可以知道自己是黑帽子。第一个人没有猜对,说明第二和第三个人中肯定有黑帽子。
如果第三个人是白帽子,由于第二和第三个中肯定有黑帽子,那么第二个人肯定是黑帽子。第二个人没有猜对,说明第三个人不是白帽子。
所以第三个人知道自己肯定是黑帽子。

25、海量日志数据,提取出某日访问百度次数最多的那个IP。

IP地址最多有2^32=4G种取值可能,所以不能完全加载到内存中。
可以考虑分而治之的策略,按照IP地址的hash(IP)%1024值,将海量日志存储到1024个小文件中。每个小文件最多包含4M个IP地址。
对于每个小文件,可以构建一个IP作为key,出现次数作为value的hash_map,并记录当前出现次数最多的1个IP地址。
有了1024个小文件中的出现次数最多的IP,我们就可以轻松得到总体上出现次数最多的IP。

26、给40亿个不重复的unsigned int的整数,没排过序的,然后再给几个数,如何快速判断这几个数是否在那40亿个数当中?

unsigned int 的取值范围是0到2^32-1。我们可以申请连续的2^32/8=512M的内存,用每一个bit对应一个unsigned int数字。首先将512M内存都初始化为0,然后每处理一个数字就将其对应的bit设置为1。当需要查询时,直接找到对应bit,看其值是0还是1即可。

27、排序数组中,找出给定数字的出现次数;(微软)

使用二分查找的方法分别找出给定数字的开始和结束位置,最坏情况下时间复杂度为O(logn)。
方法比较直接,不过代码写起来还有些难度。有兴趣的xdjm可以练习一下 :-)

28、给定字符串,删除开始和结尾处的空格,并将中间的多个连续的空格合并成一个。
比如 “ I like http://hi.baidu.com/mianshiti ” 会变成 "I like http://hi.baidu.com/mianshiti"。

void RemoveExtraSpace(char* str) {
bool keep_space = false;
int new_str_end = 0;

for (int i = 0; str[i]; ++i) {
if (str[i] != " ") {
str[new_str_end++] = str[i];
keep_space = true;
} else if (keep_space) {
str[new_str_end++] = str[i];
keep_space = false;
}
}

if (new_str_end > 0 && str[new_str_end - 1] == " ") {
str[new_str_end - 1] = '\0';
} else {
str[new_str_end] = '\0';
}
}
29、微软面试题:正则表达式提取链接地址
写出正则表达式,从一个字符串中提取链接地址。比如下面字符串中
"IT面试题博客中包含很多 <a href=http://hi.baidu.com/mianshiti/blog/category/微软面试题> 微软面试题 </a> "
则需要提取的地址为 " http://hi.baidu.com/mianshiti/blog/category/微软面试题 "
在python中:

import re
p = re.compile('<a(?: [^>]*)+href=([^ >]*)(?: [^>]*)*>')
content = "IT面试题博客中包含很多 <a href=http://hi.baidu.com/mianshiti/blog/category/微软面试题> 微软面试题 </a> "
p.search(content).groups()

这段代码对于给出的例子是足够了,但实际情况中还需要考虑链接地址两边的单引号或者双引号,href的大小写,情况会稍微复杂些。

另外,如果面试者对正则表达式完全没有概念,可以和面试官申请换一道题,一般不会有太大影响。

参考资料:
http://wiki.ubuntu.org.cn/Python正则表达式操作指南

30、从输入URL到显示网页,后台发生了什么?

作为一个软件开发者,你一定会对网络应用如何工作有一个完整的层次化的认知,同样这里也包括这些应用所用到的技术:像浏览器,HTTP,HTML,网络服务器,需求处理等等。

本文将更深入的研究当你输入一个网址的时候,后台到底发生了一件件什么样的事~

1. 首先嘛,你得在浏览器里输入要网址:

image

2. 浏览器查找域名的IP地址

image

导航的第一步是通过访问的域名找出其IP地址。DNS查找过程如下:

  • 浏览器缓存 – 浏览器会缓存DNS记录一段时间。 有趣的是,操作系统没有告诉浏览器储存DNS记录的时间,这样不同浏览器会储存个自固定的一个时间(2分钟到30分钟不等)。
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值