校招部分资料整理

前言

好吧,这个事情非常重要。大多数投的C++岗,这里的资料估计不全,留给自己看、

校招资料

Github上面的资料,第二个真的很好。

在简书上看到的面试算法知识梳理

海量数据面试题的处理方法,第二篇是第一篇的总结(较为完善)

算法

1.快排:http://developer.51cto.com/art/201403/430986.htm
但是这个方法需要从右边开始循环(以左边作为基准),原因如下:
如果从左边开始,6 1 2 7 9这个序列的话最后是交换6和7,把7放到了6的左边。
2.用位运算实现四则运算:https://blog.csdn.net/hackbuteer1/article/details/7390093
3.堆排,解决topk问题
https://www.cnblogs.com/chengxiao/p/6129630.html

linux内容

上面的github链接中的linux部分

1
2
3
4
5
6
7
8
9
1.sync:为了加快对磁盘文件的读写速度,位于内存中的文件数据不会立即同步到磁盘上,因此关机之前需要先进行 sync 同步操作。
2.实体链接和软连接
3.tar解压:`tar -zxvf FileName.tar`
tar压缩:`tar -czvf FileName.tar DirName`
4.输出重定向会将输出内容重定向到文件中,而 tee 不仅能够完成这个功能,还能保留屏幕上的输出。也就是说,使用 tee 指令,一个输出会同时传送到文件和屏幕上。
`$ tee [-a] file`,`cat test.txt|tee t.txt`就是输出test.txt的内容并且重定向到t.txt这个文件中
5.tr用来删除一行中的字符,或者对字符进行替换。
比如`$ tr 'a-z' 'A-Z' <test.txt`,可以在屏幕上将test.txt输出,并且将小写替
换成大写

HTTP

1.为什么你用POST而不是GET请求呢?它们有什么差别没有?还有可以描述一下这个请求在后端处理的流程吗?
A:GET参数都是明文传输的,在URL里。POST在body里面,不可见。GET只支持传递ascii字符,POST支持各种编码,GET会被浏览器缓存,POST不会.

2.refer防盗链讲解:https://www.jianshu.com/p/c02064db8b5b
refer是一个HTTP的header的首部

3.COOKIE和SESSION有什么区别? - 欲三更的回答 - 知乎
https://www.zhihu.com/question/19786827/answer/84540780
如果还是有点不理解的话可以进一步看一下阮老师的jwt,如果写过后端方面的开发应该还是比较好理解的
http://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html
session这个东西是一个会话,通过cookie可以比较方便地实现session的这个功能

网络

1.有A和B两台服务器,需要做时间同步,你来构想怎么写一个程序让他们之间的误差尽可能地小。(网络延时怎么解决)
方法:使用UDP(因为TCP有重传机制),A向B发送一个UDP的包,带一个唯一标识,然后等B也返回一个UDP的包,可以计算出传输往返过程中使用的时间,然后测试一段时间内的波动,稳定的话取个平均值,消去影响即可。

2.对于ARP和mac地址可能有点模糊,可以看下
TCP/IP: 在广域网(外网)上传输数据时会用到ARP协议吗?
https://www.zhihu.com/question/49337715

数据库

ACID,指数据库事务正确执行的四个基本要素的缩写。
包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
事务:是用户定义的一个数据库操作序列,这些操作要么都做,要么都不做,是一个不可分割的工作单位。
在关系数据库中,一个事务可以是一条SQL语句,也可以是多条SQL语句。

C++

1.指针和引用的区别,心里当然是清楚的,不过还是看一下整理
C++中指针和引用的区别

2.int const和int const的区别
关于const int, int const以及int *const的区别

1
2
3
4
5
6
7
8
9
使用从右往左读的方法
int const* ip; // ip is a pointer to int const
int* const ip; // ip is a const pointer to int
const int* ip; // ip is a pointer to const int
再补充几个在笔试遇到的
int *a[10]; //指向int类型的指针数组a[10]
int (*a)[10]; //指向有10个int类型数组的指针int (*a)(int);//函数指针,指向有一个参数并且返回类型 均为int的函数
int (*a[10])(int); //函数指针的数组,指向有一个参数并且返回类型均为int的函数的数组
int *a[10]; //指向int类型的指针数组a[10]

还可以看下Stack Overflow的讲解
Stack Overflow - What is the difference between const int, const int const, and int const *?
注意没有const int& *var,因为指向指针的引用是没有意义的,编译会报错

3.为什么不能用迭代器对vector进行插入

4.有关sizeof引用等
int的大小是4个字节,b是a的引用,sizeof(b)当然也是4
在64位系统中,指针的大小是8个字节,当然包括int m,sizeof(&m),int *n,sizeof(n)
struct,里面没有变量,大小是1,有一个int,大小就是4,再加个指针,大小是16(应该是跟内存对齐有关),如果在里面定义函数,不占struct的空间

智力题

1.鹅肠的一道面试智力题
校长把你(A)和另一个人(B)叫到了办公室玩一个游戏。A和B的背后会贴上0或者1的字(可以都为1或者0),A和B贴上字之后可以看到对方贴的字,但是不允许有任何交流。
A和B事先可以进行协商策略,问何种策略可以A和B中至少有一个人猜对。
解答:其中一个人猜另一个人背后的字,另一个人猜他背后贴的数字的相反数。

2.瓜子的一道面试题
现在有甲乙两个人,两块蛋糕,首先甲来切第一块,然后乙选择谁先拿,然后甲切第二块蛋糕,之前后拿的人先拿蛋糕,问甲要怎么切才能拿的最多。
解答:这题的分析方法是首先假设甲不切,那么一人一块。
如果甲切一半,那么乙会让甲先拿,然后甲会切第二次,也是切一半才能拿最多,此时还是甲和乙一人一块。
分析可以得到第一次切1/4的情况下甲能拿的最多

3.8瓶酒一瓶有毒,用人测试。每次测试结果8小时后才会得出,而你只有8个小时的时间。问最少需要()人测试?
答案为3,二进制方式求解
https://www.nowcoder.com/questionTerminal/c26c4e43c77440ee9497b20118871bf1

4.飞机加油问题
https://www.nowcoder.com/questionTerminal/4e0a532cb417466e9915b9c6e26bed0f

5.如何通过一个5L的杯子和一个3L的杯子得到4L的水,水的量无限
首先把5L的杯子倒满,然后将5L倒入3L的杯子,得到2L的水,然后把2L的水倒入3L的杯子,然后倒满5L的水之后倒入3L的杯子,剩下4L的水

如果对您有帮助,请我喝杯咖啡?