文章 内容涵盖量大,建议先收藏

更多c/c++ Linux服务器高阶知识请加开发交流群1023370945获取

知识点有C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。

目录

1. 删除字符串s1 中在字符串s2 中出现的字符。

2. 求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。

3. 有序链表合并.

4. 有n种硬币,面额分别为1~n,每种硬币都有无限个,假设要付款的金额为m。

5. 一个数列:-1 2 -3 4 -5 6 ... 询问q次,每次询问区间[l,r]的区间和,输出每个询问的答案。

6. 牛妹有剪刀,石头,布(以0,1,2表示)三种卡片无限张。现在牛妹拿出n张排成一排。然后你也拿出n张牌一一对应比对。若赢一局则获得一分。若你想得k分。现在输入n,k和牛妹的n张牌分别是什么,你想要恰好得k分,有多少种方法。

7. const的含义及实现机制,比如: const int 1,是怎么做到i只可读的?

8. 有一个射击游戏有m种颜色的气球,颜色分别为1~m现在一个人开了n枪,告诉你一个数列,表示打爆的气球颜色分别是多少。(注意,0表示这一枪没有打中,mmp这里害得我debug了好久)求一个最小区间[l,r],在区间内包含了所有1~m颜色。输出区间长度。

9. 到商店里买200的商品返还100优惠券(可以在本商店代替现金)。请问实际上折扣是多少?

10. TCP三次握手的过程, accept发生在三次握手哪个阶段?

11. 用UDP协议道讯时怎样得知目标机是否获得了数据包 ?

12. 求一个论坛的在线人数,假设有一个论坛,其注册ID有两亿个,每个ID从登陆到退出会向一个日志文件中记下登陆时间和退出时间,要求写一个算法统计一天中论坛的用户在线分布,取样粒度为秒。

13. 从10G个数中找到整数在一个文件中有10G个整数,乱序排列,要求找出中位数。内存限制为2G.

14. 两个整数集合A和B,求其交集。

15. 找出1到10w中没有出现的两个数字有1到10w这10w个数,去除2个并打乱次序,如何找出那两个数?

16. 有1000瓶水,其中有一瓶有毒,小白鼠只要尝一点带奇的水24小时后就会死亡,至少要多少只小白鼠才能在24小时时鉴别出那瓶水有毒?

17. 根据上排的数填写下排的数,并满足要求.

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

19. 1-20的两个数把和告诉A积告诉B,A说不知道是多少,B也说不知道,这时A说我知道了,B接着说我也知道了, 问这两个数是多少?

20. 爸爸妈妈妹妹小强,至少两个人同一生肖的概率是多少?

21. 计算ab<<2.

22. 如何输出源文件的标题和目前执行行的行数?

23. a[3]4哪个不能表示a[1]1: *(&a[0][0]+5) *((a+1)+1) *(&a[1]+1) *(&a[0][0]+4)*(&a[1]+1).

23. fun((exp1,exp2),(exp3,exp4,exp5))几个实参?

24. 希尔,冒泡,快速,插入哪个平均速度最快?

25. enum的声明方式

26. 频繁的插入刪除操作使用什么结构比较合适,链表还是数组?

27. *p=NULL; *p= new charl[100]; sizeof(p)各为多少?

28. 顺序查找的平均时间?

29. for(i=0,sum=0;i<10;++i,sum+=i)的运行结果?

30. 不能做 switch()的参数类型是?

31. 不使用其他变里,交换两个整型a,b的值?

32. 写出foatⅹ与"零值"比较的if语句。

33. 腾讯服务器每秒有2W个QQ号同时上线,找出5min内重新登入的qq号并打印出来。

34. 给一个奇数阶N幻方,填入数字1,2,3.N^N,使得橫竖斜方向上的和都相同.

35. IP地址的编码分为哪俩部分?

36. 描述实时系统的基本特性.

37. Internet采用哪种网络协议?该协议的主要层次结构?

38. Internet物理地址和|P地址转换采用什么协议?

39. 请描述C++的内存管理方式.

40. hash表的实现,包括STL中的哈希桶长度常数。

41. hash表如何rehash,怎么处理其中保存的资源.

42. redis的主从复制怎么做的

答案解析:

1.基本思路:把s1的字符存到一个set里面,然后遍历s2,看是否出现过,出现过就erase掉。但是直接输出set的元素这样会改变顺序,要想顺序不变,就顺序遍历一下s1 看是否出现,出现就输出。

2.一天总共有3600*24=86400秒。

定义一个长度为86400的整数数组intdelta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。

然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。

这样处理一遍后数组中存储了每秒中的人数变化情况。

定义另外一个长度为86400的整数数组intonline_num[86400],每个整数对应这一秒的论坛在线人数。

假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0]=delta[0]。第n+1秒的人数online_num[n]=online_num[n-1]+delta[n]。

这样我们就获得了一天中任意时间的在线人数。

3.

/**

4.m/n+!!(m%n)

5.第1个和第2个加起来为1,第3,4个加起来也为1......

所以前i项和为:

i/2+(i&1)*i;

区间和可以用前i项和算出来了

6.很容易想到答案跟牛妹每一张牌是什么没有关系。没一张牌只需要考虑赢、不赢。

赢k分,那就是从n张牌中拿出k张赢,

其他输,所以组合数c(n,k).对于赢了答k张,只有一种方法,但是对于剩下的n-k张,都有平局和输掉两种情况,所以是2的n-k次方。

两者相乘就是答案。

结果很大对mod=1e9+7取余,用到同余定理。

求2的幂直接暴力求(当然也可以快速幂)

求组合数的时候用到除法,

又要取余,所以用到逆元。所以用到逆元公式(当然还有其他求法):pow(x,mod-2)%mod;

但是mod=1e9+7,所以暴力求幂会超时,

方法是用快速求幂法压缩时间(快速幂就不贴代码了)

7.const用来说明所定义的变量是只读的。

这些在编译期间完成,編译器可能使用常数直接替换掉对此变量的引用。

8.这个题是XUPT 2019寒假训练最后一场比赛的原题的强化版。刚好我做了并且在bilibli上给学弟学妹们讲了,很奈斯。

用一个变量维护当前区间里有多少种颜色,用book数组表示第i种颜色在当前区间内出现了多少次。

然后尺取。

9.由于优惠券可以代替现金,所以可以使用200元优惠券买东西,然后还可以获得100元的优惠券。

假设开始时花了x元,那么可以买到x+x/2+x/4+.的东西。所以实际上折扣是50%(当然,大部分

时候很难一直兑换下去,所以50%是折扣的上限)

如果使用优惠券买东西不能获得新的优惠券,那么总过花去了200元,可以买到200+100元的商品,所以实际折扣为200/300=67%。

10.accept发生在三次握手之后。

第一次握手:客户端发送syn包(syn=j)到服务器。

第二次握手:服务器收到syn包,必须确认客户的sY(ack=j+1),同时自己也发送一个ASK包(ask=k)。

第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1)。

握手完成后,客户端和服务器就建立了tcp连接。这时可以调用 accept函数获得此连接。

11.可以在每个数据包中插入一个唯一的ID,比如 timestamp或者递增的int。

发送方在发送数据时将此ID和发送时间记录在本地。

接收方在收到数据后将ID再发给发送方作为回应。

发送方如果收到回应,则知道接收方已经收到相应的数据包;如果在指定时间内没有收到回应,则数据包可能丢失,需要重复上面的过程重新发送一次,直到确定对方收到。

12.一天总共有3600*24=8600秒。

定义一个长度为86400的整数数组 int delta[86400],每个整数对应这一秒的人数变化值,可能为正也可能为负。开始时将数组元素都初始化为0。

然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。

这样处理一遄后数组中存储了每秒中的人数变化情况。

定义另外一个长度为86400的整数数组 int online num[86400,每个整数对应这一秒的论坛在线人数。

假设一天开始时论坛在线人数为0,则第1秒的人数 online num[0]= delta[0]。第n+1秒的人数

line num[n]= online num[n-1]+delta[n]。

这样我们就获得了一天中任意时间的在线人数。

13.不妨假设10G个整数是64bit的。

2G内存可以存放256M个64bit整数。

我们可以将64bit的整数空间平均分成256M个取值范围,用2G的内存对每个取值范围内出现整数个数进行统计。这样遍历一边10G整数后,我们便知道中数在那个范围内出现,以及这个范围内总共出现了多少个整数。

如果中数所在范围出现的整数比较少,我们就可以对这个范围内的整数进行排序,找到中数。如果这个范围还可以采用同样的方法将此范围再次分成多个更小的范围(256M-228,所以最多需要3次就可以将此范围缩小到1,也就找到了中数)

文章篇幅有限

小编已经整理最新腾讯,阿里,百度,京东,华为等一线大厂面试题集答案解析,汇总成PDF文件 ,

需要的朋友可以一键三连(关注+收藏+转发)后,私信我免费获获取

更多c/c++ Linux服务器高阶知识请加开发交流群1023370945获取

知识点有C/C++,Linux,golang技术,Nginx,ZeroMQ,MySQL,Redis,fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,TCP/IP,协程,DPDK等等。