头条1 2 3面经
国内某985 鹅厂微信实习生 本科菜鸡
连续三面,差不多4小时
一面:
首先问了项目,聊了挺久的项目
算法:
1. 两个相交的单链表,找出交点
2. 给一棵树,找出路径和为n的路径
基础:
1. static关键字
2. 在一个函数内定义一个static对象,什么时候构造和析构。如果这个函数从没被调用,会怎么被析构
3. tcp连接和断开
4. 服务器大量close_wait状态,可能是什么原因,怎么解决
一面还有很多问题的,忘了。。。
一面感觉:那个两个相加的单链表的算法,我提出的算法他没见过,然后我证明,然后balabala说的不好,然后跳了。。。
这也是一面唯一一个感觉面的不好的地方
二面:
1. 设计LRU ***,查找复杂的O(1), 过期淘汰
数据库:
2. 联合索引, 最左匹配
3. 假如有联合索引<a,b>,查询where a=xx and c == yy,会用到联合索引么 为什么
4. 如果数据库主键是单调严格递增的,有一个图片,通过url带上id访问,然后查询数据库,会有什么影响
5. 上面那个问题,引出一个情景题,如何设计一个序列生成器,能够单调递增,但是不是严格递增的 ?保存在内存中,宕机怎么办?多个进程怎么办?
这个问题和面试官聊了很久,因为我在微信这边不久前看到过序列生成器
6. 解决并发情况下,使序列生成器生成的id唯一。还有就是在分布式系统,多机服务器怎么办?
7.
long multiply(int m,int n) {
long score;
score = m * n;
return score;
}
这段代码会有什么问题? 然后就说了一下m*n溢出
8.
请问下面的程序一共输出多少个 “-”?,执行一次下面的程序,总共生成了多少个进程?
#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
int main(void) {
int i;
for(i=0; i<2; i ) {
fork();
write(1, "-", 1);
}
wait(NULL);
wait(NULL);
return 0;
}
我说了6次,然后解释了一遍
9. 然后说把write换成printf会多少个'-', 我算了一下,说8次,原因是printf是有缓存的
10. c语言程序的内存模型
11. 聊redis , 如果内存已经很多键了,会怎么样?然后说了一下cow 还有balabala
还有一些小问题完了
二面总结:最后的redis因为时间不够,然后面试官说结束了。感觉二面面的挺好的,和面试官聊的也很多
三面:
三面一看就是大佬,他一直在看我的简历,开始那7分钟,大家一句话都没说,很尴尬
1. 写sql
Sid:学号
Cid:课程编号
score:成绩
查询平均成绩大于 60 分的同学的学号和平均成绩
2.
void pass(){
}
int main( ) {
int x;
x = 123;
printf("%d \n",x);
pass();
printf("%d \n",x);
return 0;
}
// 123
// 456
他问在pass里面添加代码,使输出123和456
因为都在栈里面,有返回地址,占四个字节
void pass(){
int y;
int *addr = &y;
addr 加加 ;
addr加加 ;
*addr = 456;
}
大概思路是这样, 细节有待斟酌
算法题:
3.
随机数生成器:
float rand(); [0,1)
int rand5();
int rand7();
这个通过rand,然后写出rand5,最后写出rand7。面试官刚开始说rand返回[0,1),然后让我写代码验证,
我心里一凉,是不是写错了。果然跑的结果不对,然后现场debug,rand返回的是一个unsigned int,根本不是[0,1),
然后改好了
4. 写一个函数,N 个数字,找到其中第 K 大的数,要求平均时间复杂度尽量低。
我写出来后他让我算时间复杂度,时间复杂度一直没算对,还用了主定理。 作为一个理科生,最后时间复杂度要数列求和,没求出来,很惭愧
三面总结:
三面时间最长,一个半小时,最后那个时间复杂度没算对,很伤心。。。其他感觉都没什么问题
头条真的很考算法和基础,我记忆力不太好,中间的很多小细节问题都忘了,想起来了再给大家补。
然后hr说两周内出结果,耐心等待