能获得腾讯视频技术部所给出的实习生面试机会,真的很感激我的一位素未谋面过的学姐。何德何能,能获得腾讯公司的面试资格。那我从获取面试机会到一面和二面开始说起。
腾讯暑期实习生开招,到官网上看了一下,填了技术方向的简历,前三步,都是基本信息,我很快填完,但是到了最后一步,一看我就有些发愁,需要填写学生干部任职情况,奖学金情况,参加比赛的经历以及证明。当时我就劝退了,无奈大学三年没有任何出彩经历。于是我便放下了简历填写,开始摸鱼了。
但是非常巧的是,过了一天,腾讯里的一位小姐姐居然给我打了电话,问我是不是填写了后台开发方向的简历没有填写完整,我说是,于是她问了我在大学期间有没有做过什么项目,都是怎么学习的。我如实回答:大学里面喜欢阅读一些编程书籍,有时候上网上找一些项目做,但都是很简单的项目,使用过spring boot和Vue框架,学过android 开发…blabla之类的。 后来小姐姐说那你把简历给我发一份来,我们给你安排一个面试。于是我赶紧把简历上面的项目附上地址,完善了一下README.md,把简历发送到小姐姐的邮箱里了。
于是便开始了实习生面试。
为了准备面试赶紧开始复习计算机网络,数据结构,认为一面不会问太多的项目,就没有怎么准备项目(我这是大错特错!!项目一定要认真准备!!面试官会问!!)
一面问到的问题:
面试官:我看你项目里有spring,那你跟我说说MVC是怎么个原理
我:Model View Controller。 Model的数据映射到View上面,View的数据改变经过Controller会反馈给Model,Controller用来做一些逻辑处理。(我也不知道对不对)
面试官:你数据库MySQL,说说MySQL的存储引擎
我:只知道两个 Innodb,Myisam。其他的都不知道了。(Innodb表级锁和行级锁,行级锁建立在索引上的 Myisam 表级锁)
面试官:说说mysql有几种索引。
我:外键,主键,blabla说了好多不知所以的东西,其实我也不知道有几种索引。。。。
面试官又问了 B和B+树的区别,B+树查找的复杂度,如果使用B+树,那么 between语句的时间复杂度是多少。
后来又问了问我的项目,比如我的电子商务平台(很low的一个课后小项目)是怎么样的,怎么设计的接口。我说没有接口,直接使用JSP实现的。。。。
然后又聊了聊其他的项目,问我的android 的项目是否打包了,我说是打包了,可以运行在手机上面。
我又说了我的那个东软云医院的项目(课设项目)blabla,所以说要面试,得让面试官有的问才行啊。。虽然我的这些项目经历,跟我们同届的好多同学比起来还是很law的。。
后来开始写代码:
面试官:设计一个二叉树节点吧
心想(那么多leetcode,就算算法不会写,二叉树的节点可是信手拈来啊)
很快写完了
struct Node
{
int val;
Node* left;
Node* right;
Node(int v):val(v),left(NULL),right(NULL){}
Node():val(0),left(NULL),right(NULL){}
int freq;//在写插入的时候增加的
}
面试官:写一个插入
我瞬间感觉无助,硬着头皮写,坑坑憋憋的写完了
void insert(Node* root,int val)
{
if(root==NULL)
{
root = new Node(val);
return;
}
while(root->left!=NULL || root->right!=NULL)
{
if(root->val > val)
{
root = root->left;
}else if(root->val == val)//这个是临时加的,如果相等,直接增加节点的频率
{
root->freq++;
}else
{
root = root->right;
}
}
if(root->val > val)
root->left = new Node(val);
else
root->right = new Node(val);
}//过了一天之后,再看一遍代码,发现是错的!!!!!!
//正确版本
void insert(Node* root,int val)
{
if(root==NULL)
{
root = new Node(val);
return;
}
Node* pre;
while(root!=NULL)
{
pre=root;
if(root->val > val)
{
root = root->left;
}else if(root->val == val)
{
root->freq++;
}else
{
root = root->right;
}
}
if(pre->val > val) pre->left = new Node(val);else pre->right = new Node(val)
}
面试官:你写个递归的,二叉树插入基本都是递归的
Node* Insert(Node* root,int val) //这个是在面试官让我测试之后修改的。
{
if(root==NULL)
{
Node* n = new Node(val);
return n;
}else
{
if(root->val > val)
{
root->left = Insert(root->left,val);
}else if(root->val ==val)
{
root->freq ++;
}else
{
root->right = Insert(root->right,val);
}
}
return root;
}
面试官:写个中序遍历
void track(Node* root)
{
if(root!=NULL)
{
track(root->left);
cout<<root->val<<endl;
track(root->right);
}
}//然后让我说说中序遍历的栈的实现 -打个点明天写
//用栈实现的
void track_(Node* root)
{
stack<Node*> s;
while(root!=NULL)
{
s.push(root);
root=root->left;
}
while(!s.empty())
{
Node* tmp = s.top();
s.pop();
cout<<tmp->val<<endl;
if(tmp->right!=NULL)
{
Node* t1 = tmp->right;
while(t1!=NULL)
{
s.push(t1);
t1 = t1->left;
}
}
}
}
面试官:写个main方法测试一下
int main()
{
Node* root = new Node(1);
//insert(root,2);
//insert(root,3);
Insert(root,2);
Insert(root,3);
track(root);
}
最后面试官又看看我的简历,你系统都部署在window上吗
没有,也有在linux上面部署,当时为了学习docker
没想到后来面试官又问了一个docker的问题,docker rm [容器名字] 做了什么?
我猜测是做了一个存档。
后来就马马虎虎过去了。。
二面,重点!!二面的小姐姐就是一开始给我打电话的,真没想到竟然是我的学姐,真的是感激啊,要没有学姐,估计我连这次面试的机会都没有。
简单的打招呼之后,切入正题
先问了我一个内容,从我打开网址v.qq.com 显示这段时间,都发生了什么?
我说 dns dhcp 协议 http tcp/ip blabla 感觉自己的表述能力还是不行。。。
一道sql问题:找出所有课程成绩都大于80分的学生姓名
张三 | 数学 | 90 |
---|---|---|
张三 | 语文 | 76 |
李四 | 数学 | 73 |
李四 | 语文 | 90 |
王五 | 语文 | 90 |
王五 | 数学 | 89 |
王五 | 英语 | 97 |
一开始没有思路,在面试官的百般提示之下,我才写对。核心就是用所有的人的名字,减去成绩小于80分的学生的名字。简直太妙了!!!
select distinct(name) from table where name not in (select name from table where score <=80);
2,读取一个文件,将文件中的单词按照字典序排序,并且输出每个单词的个数
我蒙了,如何读取文件,用c++!!!
后来面试官说你可以输入一个字符串
我sb一样的直接 string s; cin>> s;
没有考虑这个不会读入空格!!!!因为这个我调了五分钟的bug!!!!简直丢人了。。。
后来还好把代码改对了
#include
using namespace std;
bool cmp(string a1,string a2)
{
int len = min(a1.size(),a2.size());
for(int i = 0; i<len; i++)
{
if(a1[i]<a2[i]) return true;
else if(a1[i]>a2[i]) return false;
}
return a1.size()<a2.size();
}
int main()
{
string s;
getline(cin,s);
string word="";
vector<string> res;
map<string,int> m;
for(int i = 0; i < s.size(); i++)
{
if(s[i]==32)
{
//cout<
string tmp = word;
res.push_back(tmp);
m[word]++;
word="";
}else
{
word+=s[i];
}
}
res.push_back(word);
m[word]++;
sort(res.begin(),res.end(),cmp);
cout<<"单词字典序"<<endl;
string w="";
for(int i = 0; i < res.size(); i++)
{
if(w==res[i])continue;
w = res[i];
cout<<res[i]<<" "<<m[res[i]]<<endl;
}
} //打个点 -明天写c++的文件读写。
//文件读写
ifstream ifs;
ifs.open("test.txt",ios_base::in);
char c;
while(ifs.good())
{
c=ifs.get();
if(c==32)
{
res.push_back(word);
m[word]++;
word="";
}else
{
word+=c;
}
}
然后就是leader来面我了,简直不要太囧了。。。
一针见血,你这些项目都是刷的项目吧(的确很明显看出来像是刷的,我的项目都是把地址一说,然后其他的啥也没了,写了又三四个 -ps:以后写简历项目还是要简洁的叙述一下啊。。。。)
你的项目有什么难点,数据库怎么设计的,都有那些表,分表了吗,业务都有什么,你是怎么组合表的,外键是怎么设计的,为什么数据库要有数据的冗余,数据库的范式为什么(事务的完整性,一致性),
jwt具体是怎么用的,啊?你就是这么用的jwt啊?哪有这么用的?你说说jwt和session的用处
你密码直接明文存储啊?哪有你这样的?
什么,前端数据的映射,这有啥难的啊?直接把这个值存在数据库就可以了啊?
什么是常数项表?还要有这些?
NAT知道不,如何使用外部的设备直接访问,内部的路由器? NAT穿透都有哪些方式?
这个leader还非常的好,每当我说错的时候,或者不会的时候都会去认真的为我解答。
真的,我面试也太幸运了,遇到了好的面试官!!
blabla说了好多,知道我几斤几两了。。。。