当前位置: 首页 > 面试经验 >

分享携程客户端面经

优质
小牛编辑
157浏览
2023-03-28

分享携程客户端面经

可能有的内容答得不完善不正确,请大家注意甄别。

一面(9.9 45min)
1.    自我介绍
2.    C++ 指针(指针存储的值是内存的地址值,指针的大小与 CPU 位数相同;指针是根据这个指针的类型来确定读取方式的,如果是 int* 型指针就从指针的值开始往后读 4 个字节,如果是 double* 型指针就是往后读 8 个字节,自增也是往后移动该类型数据的长度;如果是 void* 类型指针则无法读取,因为不知道指向的数据是什么类型的,也不能做自增操作(GNU 可以做自增操作往后移 1 个字节),所以 malloc() 返回的 void* 指针需要做强制类型转换才可以对用这个指针访问数据)
3.    避免内存泄漏(C++ 由程序员管理内存的申请和释放,需要注意 malloc/free,new/delete 相互对应:比如,对 new 出来对象的浅拷贝释放,需要注意可能被多次释放的问题;申请二维数组要先释放数据数组再释放指针数组等;使用智能指针辅助管理)
4.    哈希表(数据经过哈希函数运算后存储到哈希表当中,哈希函数的设计要尽可能保证哈希分布随机离散,当发生两个数据哈希后的哈希值相同(哈希碰撞)可以用拉链法(一个哈希值坐标下挂载一个哈希桶),线性探测(往哈希表该坐标后探测,如果为空则装入,容易发生哈希堆积),二次哈希,建立公共池的方法解决;哈希表具有很好的访问平均时间复杂度 O(1))
5.    哈希表链表长度过长是怎么处理的(将哈希桶的存储结构由链表修改为红黑树,访问的凭据时间复杂度可从 O(n) 下降为 O(logN))
6.    线程和进程的区别(进程是系统资源分配的基本单位,线程是调度的基本单位,进程的内存空间是用虚拟内存相互隔离的,不同进程各自拥有自己的栈,堆,全局区,代码区;同一进程的线程共享进程的堆区和全局区,所以线程切换比进程切换的开销更小,适合关联性大的,频繁的任务调度)
7.    线程安全(多个线程访问一个变量在多个线程看来总是正确的、一致的、相同的,该变量不存在数据污染)
8.  Volitale(C++ 中用 Volitale 修饰的数据表达这个数据是易变的,每次读取都要从内存中读。感觉不是面试官想问的,既然问了线程安全应该是想问 Java 中的 volitale。)
9.  数据库事务(在 MySQL 中在 begin; 和 commit; 中间的内容,使用事务是为了实现多条语句在运行时数据库系统也能为其提供原子性,和对应的隔离性(RC,RR)
10.  TCP 为什么需要三次握手(最少需要三次握手保证双方建立可靠通信,如果两次握手,那么服务端需要在收到 SYN 就进入 established 状态,如果返回的 SYN + ACK 没有递达,那么只建立了一个单方向的连接,并且服务端在建立连接后就可以发送数据了,却无法被正常接收,无故增加网络负担;TCP 需要用三次握手互相协商双发的序列号和确认号)
11.  HTTP 报文格式(请求头(请求方式,host,版本)/响应头(响应号,响应短语,版本),header(catch-control,content-length,连接状态,接受/使用的压缩方式等),[ body ])
12.  HTTP 怎么确定报文读完(一开始答得 /r/n,面试官不太满意,又说了 content-length)
13.  算法:求和最大的连续子数组并输出和
14.  项目相关

一周后凉,进人才池。

 类似资料: