大家好,我是阿秀。
这段时间深信服逐步开奖了,目前已经知道的价是 19K * 16,算是个大白菜价,很多人甚至将之称为"劝退价"。
据说这部分先开奖的人是最开始线下面试的一批同学,流程走得比较快。
除去 19k * 16这一档,我看了下牛客网和offershow上的爆料,我发现今年深信服的技术岗薪资还有两档,我汇总了一下:
大白菜:17-19k * 16(部分部门12-18个月),没有签字费 SP:21-24k * 16 (部分部门12-18个月)+ 15w-20w签字费 SSP:27-29k * 16 (部分部门12-18个月)+ 25w-30w签字费
其中签字费是分三年发放的,也就是说你要呆满三年才能拿满,并不是你签约或者入职就能直接全部发放给你,如果在这三年时间里你主动离职或者被动离职,那么这些签字费也就跟你说拜拜了。
前几届也有一些校招进入深信服的同学,但其中很多人甚至干不满一年就离职了。。。主要原因是深信服加班很严重,不是一般的严重,有打算去深信服的同学建议提前去网上搜搜相关新闻,用关键字"窑鸡厂加班"去搜索就能看到很多精彩内容,这里就不做展示了。
今天分享一位25届同学的深信服技术岗一面面经,整体面试不难,主要考察的内容是编程语言、计算机网络、操作系统、SQL、两道手撕算法。
C++
1、介绍C++面向对象的三大特性
三大特性:继承、封装和多态
(1)继承:让某种类型对象获得另一个类型对象的属性和方法。它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展
(2)封装:把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏,例如:将公共的数据或方法使用public修饰,而不希望被访问的数据或方法采用private修饰。
(3)多态:同一事物表现出不同事物的能力,即向不同对象发送同一消息,不同的对象在接收时会产生不同的行为(重载实现编译时多态,虚函数实现运行时多态)。
2、C++ 11有哪些新特性?
nullptr替代 NULL 引入了 auto 和 decltype 这两个关键字实现了类型推导 基于范围的 for 循环for(auto& i : res){} 类和结构体的中初始化列表 Lambda 表达式(匿名函数) std::forward_list(单向链表) 右值引用和move语义
3、hashtable中解决冲突有哪些方法?
线性探测
使用hash函数计算出的位置如果已经有元素占用了,则向后依次寻找,找到表尾则回到表头,直到找到一个空位
开链
每个表格维护一个list,如果hash函数计算出的格子相同,则按顺序存在这个list中
再散列
发生冲突时使用另一种hash函数再计算一个地址,直到不冲突
二次探测
使用hash函数计算出的位置如果已经有元素占用了,按照、、…的步长依次寻找,如果步长是随机数序列,则称之为伪随机探测
4、下面这两个哪个是指针数组和数组指针?
int *p[10]
int (*p)[10]
int *p[10]表示指针数组,强调数组概念,是一个数组变量,数组大小为10,数组内每个元素都是指向int类型的指针变量。
int (*p)[10]表示数组指针,强调是指针,只有一个变量,是指针类型,不过指向的是一个int类型的数组,这个数组大小是10。
操作系统
5、堆和栈的区别
堆 | 栈 | |
---|---|---|
管理方式 | 堆中资源由程序员控制(容易产生memory leak) | 栈资源由编译器自动管理,无需手工控制 |
内存管理机制 | 系统有一个记录空闲内存地址的链表,当系统收到程序申请时,遍历该链表,寻找第一个空间大于申请空间的堆结点,删 除空闲结点链表中的该结点,并将该结点空间分配给程序(大多数系统会在这块内存空间首地址记录本次分配的大小,这样delete才能正确释放本内存空间,另外系统会将多余的部分重新放入空闲链表中) | 只要栈的剩余空间大于所申请空间,系统为程序提供内存,否则报异常提示栈溢出。(这一块理解一下链表和队列的区别,不连续空间和连续空间的区别,应该就比较好理解这两种机制的区别了) |
空间大小 | 堆是不连续的内存区域(因为系统是用链表来存储空闲内存地址,自然不是连续的),堆大小受限于计算机系统中有效的虚拟内存(32bit 系统理论上是4G),所以堆的空间比较灵活,比较大 | 栈是一块连续的内存区域,大小是操作系统预定好的,windows下栈大小是2M(也有是1M,在 编译时确定,VC中可设置) |
碎片问题 | 对于堆,频繁的new/delete会造成大量碎片,使程序效率降低 | 对于栈,它是有点类似于数据结构上的一个先进后出的栈,进出一一对应,不会产生碎片。(看到这里我突然明白了为什么面试官在问我堆和栈的区别之前先问了我栈和队列的区别) |
生长方向 | 堆向上,向高地址方向增长。 | 栈向下,向低地址方向增长。 |
分配方式 | 堆都是动态分配(没有静态分配的堆) | 栈有静态分配和动态分配,静态分配由编译器完成(如局部变量分配),动态分配由alloca函数分配,但栈的动态分配的资源由编译器进行释放,无需程序员实现。 |
分配效率 | 堆由C/C++函数库提供,机制很复杂。所以堆的效率比栈低很多。 | 栈是其系统提供的数据结构,计算机在底层对栈提供支持,分配专门 寄存器存放栈地址,栈操作有专门指令。 |
6、大小端存储是什么意思?如何区分?
大端存储:字数据的高字节存储在低地址中;小端存储:字数据的低字节存储在低地址中
例如:32bit的数字0x12345678
所以在Socket编程中,往往需要将操作系统所用的小端存储的IP地址转换为大端存储,这样才能进行网络传输
小端模式中的存储方式为:
大端模式中的存储方式为:
了解了大小端存储的方式,如何在代码中进行判断呢?下面介绍两种判断方式:
方式一:使用强制类型转换
#include <iostream>
using namespace std;
int main()
{
int a = 0x1234;
//由于int和char的长度不同,借助int型转换成char型,只会留下低地址的部分
char c = (char)(a);
if (c == 0x12)
cout << "big endian" << endl;
else if(c == 0x34)
cout << "little endian" << endl;
}
方式二:巧用union联合体
#include <iostream>
using namespace std;
//union联合体的重叠式存储,endian联合体占用内存的空间为每个成员字节长度的最大值
union endian
{
int a;
char ch;
};
int main()
{
endian value;
value.a = 0x1234;
//a和ch共用4字节的内存空间
if (value.ch == 0x12)
cout << "big endian"<<endl;
else if (value.ch == 0x34)
cout << "little endian"<<endl;
}
计算机网络
7、TCP是如何保证可靠传输的?
确认和重传:接收方收到报文就会确认,发送方发送一段时间后没有收到确认就会重传。 数据校验:TCP报文头有校验和,用于校验报文是否损坏。 数据合理分片和排序:tcp会按最大传输单元(MTU)合理分片,接收方会缓存未按序到达的数据,重新排序后交给应用层。而UDP:IP数据报大于1500字节,大于MTU。这个时候发送方的IP层就需要分片,把数据报分成若干片,是的每一片都小于MTU。而接收方IP层则需要进行数据报的重组。由于UDP的特性,某一片数据丢失时,接收方便无法重组数据报,导致丢弃整个UDP数据报。 流量控制:当接收方来不及处理发送方的数据,能通过滑动窗口,提示发送方降低发送的速率,防止包丢失。 拥塞控制:当网络拥塞时,通过拥塞窗口,减少数据的发送,防止包丢失。
8、Cookies和Session分别存放在哪里?
cookie:存放在客户端,session:存放在服务端。Session存储的数据比较安全
SQL
9、一个班级成绩表,将sex为male何female的区分开来,你会怎么写SQL?
SELECT sex, COUNT(*) as total_students, AVG(score) as average_score
FROM grades
WHERE sex IN ('male', 'female')
GROUP BY sex;
手撕算法
1、手写快排
2、判断链表是否有环
你好,我是阿秀,普通学校毕业,校招时拿到字节跳动SP、百度、华为、农业银行等6个互联网中大厂offer,这是我在校期间的编程学习之路,详细记录了我是如何自学技术以应对第二年的校招秋招的。
毕业后我先于抖音部门担任全栈开发工程师,目前在上海某外企带领团队继续从事全栈开发,负责的项目顺利盈利 300w+。在研三那年就组建了一个阿秀的学习圈,一直持续分享校招/社招跳槽找工作的经验,都是自己一路走过来的经验,目前已经累计服务超过 4000 +人,欢迎点此了解一二。