2020腾讯春招面经(WXG PCG)

3.13 WXG一面

c++多态:静态多态+动态多态,扯到了虚函数,多态继承,虚继承和普通继承
虚函数的实现机制:虚函数表和虚表指针,虚表指针的位置:
4种智能指针,const和static的区别。
static作用在函数时,能否访问实例化对象的非static成员(不能)
sizeof作用在数组名和指针的区别:
tcp的time_wait出现在哪个阶段,time_wait要等多久(2MSL),为啥要等这么久
三次挥手中洪泛攻击的解决。
linux会吗,不会。
sql中的varchar和char 的区别,sql中引擎
进程通信方法:无名管道,有名管道,消息队列、信号量、信号、共享内存
算法题:
链表反转,从后面往前面翻,每k个翻一次,开头部分不足k的不用翻转
用2个栈实现队列

3.16 WXG二面

左值和右值的区别
i++=2,和++i=2可以吗,i++和++i效率哪个高
share_ptr能指向一个新指针吗?share_ptr有什么问题吗
vector和list的插入和删除区别:一个线性时间,一个常数时间。
vector删除/插入后,后面迭代器是否失效。
进程有10个线程,一个线程挂了,是否影响其他线程。
Linux怎么查看端口使用情况,怎么查看cpu占用内存情况。
说一下主键索引和非主键索引的区别。
数据库中“一主多备“的情况。
算法题:
1、 给两个链表,每个结点值为0-9,求链表相加的结果,用链表表示,要求空间复杂度最优。
2、 大数据词汇,有上百亿,一个主机都存不上,怎么求次数最多的top-k
提出了unordered_map+最小堆。对于主机都存不上的问题,想到了多机处理,至于怎么保证同一个词汇放在同一个主机进行处理,想到了hash法(好吧具体怎么实现自己也没想明白,但好像面试官赞同这个观点) 。
知道一致性哈希吗?不知道
讲讲解决hash冲突的主要方法:开放地址法、链地址法、再哈希法。

3.17 WXG三面

多态,虚函数和纯虚函数
STL库的分类,具体讲讲他们各自的情况
进程间的通信方式
算法题:
分割字符串:给定长串s1和短串s2,将s1按s2做为分割符,进行分割,输出分割后的每一段。主要用了string的find函数和substr函数进行实现。

3.19 WXG 四面

1、一个cpp文件生成可执行文件的过程
2、有没用过调试?GDB?
3、c++有没用过什么框架?
4、HTTP通过tcp能不能发送长链接?
5、IO多路复用了解吗?知道。讲一下。
6、linux操作熟悉吗?常用的命令?
7、为什么说共享内存是最快的进程通信方式?
8、十几亿的人口,检测肺病,有的阴性,有的阳性,怎么快速统计数量。bitmap
9、微博和朋友圈设计区别。一脸懵,后来他和我说是读和写的问题,微博粉丝多,大V更新动态时不需去关注者写信息,因为写的代价大,而应该让关注者上线后自行去读信息;对于微信朋友圈,因为好友上限少,发朋友圈时可以直接在他的所有好友的朋友圈进行写操作。ORZ完全没想到。
10、代码实现atoi。
12、有去分析一些开源项目代码吗?

4.3 PCG 伪一面

算法:
1、给一个字符串,删除字符’a’。
思路:定义2个指针,一个从左往后扫,一个只有非’a’才往后加,最后慢的指针指向处添’\0’即可。
2、一个数组,无序,查找两个数,使得相加为val,要求空间O(1)。
思路:排序,定义两个指针,一个在前,一个在后,根据相加大小和val比较,偏小则移动前面的指针,偏大则移动后面的指针。

C++:
Map、智能指针、多态、虚函数、虚函数指针、虚函数表。问了C继承A,B,且A和B无关系,这时C的虚函数表是怎样的。

计网:
tcp握手,time_wait,没有time_wait会怎么样(没有time_wait时,客户端直接断开,后又重新连接服务器,这时服务器才收到之前的报文,导致紊乱)

mysql:
查询性能差的原因,怎么优化;hasp索引和B+索引区别

4.3 WXG-企业微信 一面

计网:输入url,发生的事情,tcpip5层协议及其相应的应用,https
操作系统:磁盘调度算法,死锁以及如何避免死锁,讲下具体实现。进程和线程,及其通信。知道unix socket吗?
C++:什么是移动语义,堆栈的区别。
算法:
1、给定一个非负整数数组,每个数字代表能往后跳的最大距离,问跳到最后一格最小需要多少步。
思路:队列,维护往后跳的最远距离。
2、给定已感染的人的集合,和若干对人,每一对代表这2个人有接触。和感染者直接或间接接触的都需要隔离,问需要隔离的人数。最多有10000人。
思路:并查集,通过若干对接触,将有直接或间接接触的人放一个集合里。把已感染的人的集合的根节点标志下,最后扫描所有人,根节点被标志的,说明需要隔离。

4.8 WXG-企业微信 二面

算法
1、给你 n 个非负整数 a1,a2,…,an,每个数代表坐标中的一个点 (i, ai) 。在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0)。找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。
说明:你不能倾斜容器,且 n 的值至少为 2。最后输出两条线的横坐标,以及最大的面积值。
PS:面试过程中,暴露以下编译错误代码,前边已初始化的变量,后边不允许未初始化的变量。
但是过后在dev编译类似这种代码,是可以编译成功的,雾。

int l = 0,r = n-1,posl,posr;

现场代码:https://paste.ubuntu.com/p/FMD6dwx8SR/
2、有一个字符串,它是一个数值表达式,如:12+3/5+7,其中操作符只有加、减、乘、除四种,没有括号,运算对象为数字。请处理该字符串,得到表达式的运算结果。(注意操作符的优先级)
double Calc( const char * str );
注:不用考虑括号、小数点、负数
测试用例:
1-2
3+4
1-10/2*3+12
现场代码:https://paste.ubuntu.com/p/jpkX9nBPZ9/
c++ 虚函数;问了3个sizeof的值,分析原因。说一下为什么需要对齐

char str[] = "hello world";
    char *p = str;
    struct s{
        short a1; 
        char * a2; 
        char a3; 
        short a4; 
        char a5[10];
    };  
    cout << sizeof(str) << endl;
    cout << sizeof(p) << endl;
    cout << sizeof(s) << endl;

说下区别
const char * p1;
char * const p2;
说下区别
malloc new
还问了以下,自己说不了解

calloc
__func__

网络 tcp3次握手,网络编程中connect和accept函数的调用分别发生在3次握手的哪个过程,如果服务器没有调用accept,connect能调用成功吗,客户端是否还可以通信?(能调用成功,客户端可以发数据给服务器,但服务器不能发数据给客户端,面试官好像同意我的观点)。http是全双工的吗?http和https的区别。什么是流量控制和拥塞控制,IO多路复用。
操作系统 进程和线程区别,进程通信。
思考题
小明在一个圆形小岛里的中心,在海边有只鳄鱼,只要遇到小明就会将小明吃掉。小明只要能跑到海边,就有快艇可以逃离。但鳄鱼的移动速度很快,是小明的4倍,问小明应该怎么运动才可以成功到达海边。想了很久,不会。
(这个问题可以理解成,鳄鱼可以随时观察小明的动态,然后在海岛边的圆运动)
面后睡觉的时候悟出来一个方法,不知正确性。
2020腾讯春招面经(WXG PCG)_第1张图片

4.9 WXG-企业微信 三面

预约了15点的视频面试,鸽了,电话联系客服。16点多的时候面试官电话过来,短信发题目给我做,然后自己又跑路了。做题过程中,题目不懂也莫得问。懵逼了一个小时多后,面试官开始问题目的做法。第一题做完,第二题没看懂题意,第三题做了一半,讲了思路。

1.对于一棵满二叉排序树深度为K,节点数为 2^K - 1 ;节点值为 1至 (2^K-1)。
给出K和任意三个节点的值,输出包含该三个节点的最小子树的根节点值
样例输入:k =4 节点:10 15 13
样例输出:12
代码:https://paste.ubuntu.com/p/4JQ5xTzVPS/
2.实现一个基于Hash的全内存LRU cache,插入时,发现节点个数超过阈值,则按照全局最近最少使用淘汰节点。
采用链地址法解决Hash冲突:Hash桶个数固定为1千万,最多只能存储1亿个的节点,每个节点的key和value都为uint32_t。
Struct Node{
uint32_t iKey;
uint32_t iElem;
其它字段 …
};
请分别实现Insert,Get接口。
代码不太确定:https://paste.ubuntu.com/p/4Bqr78RFH8/

list<pair<uint32_t,uint32_t> > li;
list<pair<uint32_t,list<pair<uint32_t,uint32_t> >::iterator> > Hash[10000000];
uint32_t Get(uint32_t key) {
	uint32_t id = key%10000000;//寻找桶id 
	int sz = Hash[id].size();
	for(int i = 0;i < sz;++i) {
		if(Hash[id][i].first == key) {//根据key值找 
			pair<uint32_t,uint32_t> p = *(Hash[id][i].second);
			li.erase(Hash[id][i].second);//删去数据 
			li.push_front(p);//提到链表 
			Hash[id][i].second = li.begin();//更新Hash 
			return p.second;
		}
	}
	return -1;//代表找不到 
}
void Insert(Node a) {
	uint32_t id = a.iKey%10000000;//寻找桶id 
	int sz = Hash[id].size();
	for(int i = 0;i < sz;++i) {
		if(Hash[id][i].first == a.iKey) {//如果key值存在 
			pair<uint32_t,uint32_t> p = *(Hash[id][i].second);
			p.second = a.iElem;//更新value 
			li.erase(Hash[id][i].second);//删去数据 
			li.push_front(p);//提到链表
			Hash[id][i].second = li.begin();//更新Hash 
			return;
		}
	}
	if(li.size() == 100000000) {//满阈值 删最少访问 
		uint32_t key = li.back().first;
		uint32_t id2 = key%10000000;
		int sz = Hash[id2].size();
    	for(auto it = Hash[id2].begin();it != Hash[id2].end();++it) {
    		if((*it).first == key) {
    			Hash[id2].erase(it);//删Hash数据 
    			break;
			}
		}
		li.pop_back();//删list数据 
	}
	/*加入数据,更新list/Hash*/ 
	li.push_front(make_pair<a.iKey,a.iElem>);
	Hash[id].push_front(make_pair<a.iKey,li.begin()>);
} 

3.逐行打印n * n回型矩阵( 不可以在内存填好整个矩阵然后再打印)
n=3
1 2 3
8 9 4
7 6 5
n=4
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
代码:https://paste.ubuntu.com/p/YWKKdn46bn/
问完题目后聊基础,tcp和udp的区别,3次握手,tcp怎么保证可靠,快排时间复杂度,为什么,最坏情况时间复杂度是多少。当时脑袋犯浑,把快排有序的时间复杂度讲错。

4.15 腾讯视频 一面

我看你前面面了好多面,是面了多少呀?WXG那边2个部门(雾
问了计图项目。有没有做过关于通信的项目。有抓过包吗?WebSocket知道吗?不知
char 占多少字节,char a = 123可以吗?char a = 323呢?
string a = “abc”,数据是在哪儿取的?a+=“ef”,每次都要去重新申请内存吗?
说下继承和组合的理解。
静态函数和静态成员函数的区别
http的报文头部有哪些内容?http中cookie字段,有什么作用。http1.0和2.0区别。说一下常见的状态码
tcp为啥要3次握手
一个程序最多可以申请多少内存?10G可以申请成功吗?1G可以申请成功吗?
linux查看系统资源占用情况(top),查看端口占用情况(netstat),查看磁盘占用情况(df -h)
说下c++编译整个过程
40亿个数怎么找哪个数是否存在?bitmap
10亿个数找前1000大
102个苹果,每次取1,2个,先手是否有必胜策略?每次取1,2,3个呢?
数据库对同一个数据同时更新,如何避免错乱,加写锁。如何加快这个过程,提高效率?多版本控制协议,写时复制。
编程题:小明是个工作狂,现在有n天,每天他可以选择工作、健身和休息,但是他不会选择连续2天工作,或者连续2天健身。给定数组 w o r k i work_i worki e x e r c i s e i exercise_i exercisei,取值为0或1,1才代表当天可以工作/健身。现在求小明最少的休息时间。现场代码:https://paste.ubuntu.com/p/gKGXHtpvty/

反问环节,用的技术栈,需要学的知识:c++,go,脚本语言比如python、shell,数据库、操作系统、算法数据结构、网络编程、安全编程、架构、设计模式、负载均衡。

4.17 腾讯视频 二面

在校经历;ACM竞赛经历,刚好前面准备了2个题。
沈阳L 二分/前缀和
哈尔滨I 组合数学
思考题
1、给了1000个苹果,10个篮子,怎么设计苹果的篮子放置,使得需求任意数量的苹果,都能整蓝提取。二进制放置。
2、给定10个瓶子,每个瓶子大小10L,初始每个瓶子都放置了一定数量的水,一个瓶子可以往另一个瓶子倒水,如果倒满了,则剩下的水留在另一个瓶子,求所有的倒水方案。搜索。

平常兴趣爱好是什么?想做工程岗还是算法岗?你现在在家还是学校?可以实习多久?

4.17 腾讯视频 HR面

在校经历。
可以实习多久,至少4个月。
什么时候可以开始实习,随时可以吧
什么时候可以全职,这个暑假之后
以后有什么打算,保研还是工作?工作
工作有什么规划吗?c++开发。go了解吗
老家在哪,家里情况
问简历上的兼职工作

4.20 oc

收到oc和正式offer

碎碎念

春招对于大佬来说,就是2、3天的事情;对于菜鸡我来说,真的是一个漫长的过程。
真的,真的,要坚强,坚持下去,万一offer就来了呢?再不济,失败了没事,多积累一份面经,不是么?春招是运气+实力,但是当你真的准备很足的时候,再差的运气都阻挡不了你拿offer了。

本人是c++后台开发方向,复习的时候,主要还是以4大基础课程为主,牛客网有成套的面经。自己复习以这两份为主。
https://www.nowcoder.com/tutorial/93/2a565e401f31468cabb3a378c60d5049
https://cyc2018.github.io/CS-Notes/#/README?id=%e2%98%81%ef%b8%8f-%e7%bd%91%e7%bb%9c
遇到不会的、不理解,有时间一定去搜博客,不要敷衍自己,不然说不定哪次面试,就坑了自己。还有就是leetcode和牛客网编程题,刷起来。
学习方式上,自己找小伙伴加了群,平时不懂的共同讨论,这样春招就不会太自闭,可以互相交流。
可以边面试边总结知识,不要等到很晚才去投简历,不然可能会错失很多提前批的面试机会。
项目经历很重要,有机会的话,多去发展自己。

哪天心情沉闷,如果自己调节不来,真的可以考虑去找找小伙伴聊聊,调节好心态。好的心态学习效率会更高。
在这里插入图片描述
还有一定劳逸结合啦,偶尔摸摸鱼是有必要的,大部分人说,春招是持久战。

你可能感兴趣的:(面经)