批次:提前批
BG:wxg
岗位:后台开发
学历:双985硕
时间:2018年8月
一、技术一面
首先是一小时时间做试卷,面试官开远程桌面观看,题目如下:
1.TCP建立连接的过程采用三次握手,已知第三次握手报文的发送序列号为10,确认序列号为5,请问第二次握手报文的发送序列号和确认序列号分别为?
答:发送序列号:4,确认序列号:10。(面试官追问了原理)
2.给出三种不同进程间通讯的方式。
答:消息队列,socket通信,共享内存,管道。(面试官追问了管道和匿名管道的区别)
3.广州从7月1号开始实行外地车牌“开四停四”的汽车行驶限制,请实现一个算法,可以根据过去若干天的行驶情况,准确判断今天是否可以出行。
bool IsLegal(bool history[], int size) //history是一个存储过去若干天(由size指定)的行驶情况,true表示有驶入管控范围,false表示停驶或未进入管控范围
返回值表示是否有存在违章情况。
bool IsLegal(bool history[], int size) {
int count = 0;
int blank = 0;
int i = 0;
while (!history[i] && i < size) {
i++;
}
for (; i < size; i++) {
if (history[i]) {
count++;
} else {
blank++;
if (blank == 4) {
count = 0;
blank = 0;
while (!history[i] && i < size) {
i++;
}
} else {
count++;
}
}
if (count > 4) {
return true;
}
}
return false;
}
C++很久没写,编译器过期了,没有编译。后来面试官追问了原理讲解。
4.给定一个非负整数数组,将它们排成一个尽可能大的数,例如,给定数组[9, 81, 6, 35, 3, 30],那最后得到的最大数是981635330. 注意,由于最终结果可能是非常大的,所以返回结果使用string类型。
string LargestNumber(vector
public class Main2 {
boolean compare(int a, int b) {
String stra = a + "";
String strb = b + "";
int lena = stra.length();
int lenb = strb.length();
for (int i = 0; i < lena && i < lenb; i++) {
if (stra.charAt(i) > strb.charAt(i)) {
return true;
} else if (stra.charAt(i) < strb.charAt(i)) {
return false;
}
}
int aa = Integer.parseInt(stra + strb);
int bb = Integer.parseInt(strb + stra);
if (aa > bb) {
return true;
} else {
return false;
}
}
String LargestNumber(int[] num) {
for (int i = 0; i < num.length; i++) {
for (int j = i + 1; j < num.length; j++) {
if (!compare(num[i], num[j])) {
int tmp = num[i];
num[i] = num[j];
num[j] = tmp;
}
}
}
StringBuilder sb = new StringBuilder();
for (int i = 0; i < num.length; i++) {
sb.append(num[i]);
}
return sb.toString();
}
}
改用Java,试了几个用例都过了。
5.给定两个字符串 s1 和 s2 ,从 s1 中删除在 s2 中出现过的字符。
char * remove( char * s1, const char * s2 );
public class Main3 {
String remove(String s1, String s2) {
for (int i = 0; i < s2.length(); i++) {
s1 = s1.replaceAll(s2.substring(i, i + 1), "");
}
return s1;
}
}
大概中午写到12点面试官去吃饭了,下午两点半面试官打了电话问了两个简历上的项目,大概半个多小时。
总体而言还是比较顺利,面试官和我同样是信息安全专业,聊得也比较投机。
二、技术二面
二面本来通知用猿圈做网面,结果互相看不到对方,改用qq视频。。。
1,首先问了一个项目,比较深入细节。
2,然后发了一道题目:格式化输出一段字符串,就是wireshark那种二进制查看器的形式,每行显示16个字符,内容为16进制行号+16进制内容+字符串内容。我用java写的,刚开始写的是十进制(忘记16进制转换函数了。。。),面试官提醒后使用Integer.toHexString()转换为16进制(其实用printf格式化输出是最简单的)。
3,最后问了一个问题:如何实现一个高效的定时器?
答:实现可以使用观察者模式,定时器作为被观察者,每个观察者可以向定时器注册和解除注册,注册就是将观察者对象添加到被观察者维护的观察者列表中。定时器轮询观察者列表,若定时已到,新建线程调用观察者的回调方法。观察者列表可以直接使用链表存储,若定时任务是海量的,可以使用堆等数据结构使其有序化(按定时任务周期长短),这样在轮询前面节点时后面的节点不会超时(其实这个我也没太想明白,基本是瞎扯的)。
三、技术三面
1,聊项目,非常深入,每说一个技术点都会深入聊;
2,比赛经历,作品,如何设计的,主要考虑哪些安全性要求,为什么能获奖?
3,口述了一个链接(面试官的发音真的有点补票准呀,听了好几次才听清),合作编程那种网页,30分钟,三道题目:
(1)链表是否有环。这个用大不小步法即可;
(2)最长递增子序列。比较简单的动归;
(3)30w个员工抽10w名幸运奖,rand()函数输出0-65535。当时时间不多,没想到多好的算法,随便写了个上去。后来想了想,应该是分成8份,先随机0-7选择区域,再随机0-37499选择区域偏移。用rand函数实现两个随机函数即可,rand1返回0-7,实现中返回rand()%8即可,rand2返回0-37499,使用大于37499就重取策略。
四、HR面
hr是个小姐姐,非常神奇地聊了一个小时,不知道怎么就聊了那么久。。。大概问题整理一下:
1,自我介绍,你觉得自己有什么缺点,这些缺点造成的最严重的后果是什么?
2,家庭成员,家庭教育中父亲和母亲谁占得比重较大?
3,本科和研究生成绩如何?
4,聊一下本科的经历,包括学习经历和社团经历。
5,研究生的研究方向,做过的项目简单介绍一下。
6,城市选择,为什么选择深圳,北京如何?
7,还面试了哪些公司,offer选择问题。
8,过往病史?
9,本科为什么选择数学?研究生为什么选择信息安全?就业为什么选择后台开发?
10,有什么要问的问题?
五、后记
拿到微信offer感觉运气成分很大,本来自己就不会C++,只会java,每轮面试都当做最后一轮看待,但就这么莫名其妙的一面一面走到了最后,感谢杨超越,感谢十四儿~~~叩拜!!
个人还是比较喜欢腾讯的面试风格的,基本从来没有语言相关的问题,只问基础、项目和撸代码,talk is 便宜, show me the 扣得!