元戎 / 百度 / 快手 / 图森秋招凉经合集
1. 元戎启行(软件工程师 - 仿真 - 一面)
C++:
- 类成员函数后加 const 和 final 关键字分别代表什么
- 如果基类析构函数没有声明为虚函数会造成什么问题
- 浅拷贝和深拷贝的区别(举例说明)
- 重写和重载的区别
- 静态库
.a
和动态库.so
的区别 - 从数据结构角度分析堆、栈、队列的区别
- map 和 unordered_map 的区别
LeetCode:
- 无序数组的中位数(类似 <数据流的中位数 No. 295>、要求
O(n)
时间复杂度、提示:快速排序) - 分割等和子集(No. 416)
2. 百度(C++/PHP/GO 研发工程师 - 小度 - 一面)
C++:
- vector 和 list 的区别以及查找、插入、删除的时间复杂度
- 向 vector 末尾
push_back
元素时底层做了哪些操作 - vector
push_back
和emplace_back
的区别以及使用场景 - 如何清空一个 vector
- vector 是线程安全的吗
- 如何解决 vector 线程不安全的情况
- 介绍一下模板的工作原理
- 虚函数和纯虚函数的区别以及使用场景
- 虚函数表存放在内存的哪个区(常量区)
- 如何避免内存泄漏(RAII / 智能指针)
- 介绍一下智能指针的几种类型
- 声明和调用一个
shared_ptr
的语句是什么 - 举一个发生会循环引用的例子以及如何解决
- 如何实现某一个线程可以独占内存
- 说一下原子变量
std::atomic
的实现原理 - new 和 malloc 的区别
- new 开辟的内存可以 free 释放掉吗
Go:
- goroutine 和线程的区别以及使用场景
- 介绍一下
context
的用法
gRPC:
- 介绍一下 gRPC 底层实现原理
LeetCode:
- 串联所有单词的子串(No. 30)
Expand:
delete
和delete[]
的区别
3. 快手(C++ 开发工程师 - 商业化 - 一面)
Redis:
- 了解哪些分布式锁的实现方式以及优缺点
- 为什么用 SET + 过期时间的方式而不使用 Lua 脚本
- 为什么需要使用 Redis 分布式锁
Project:
- 深入思考项目背景、意义、难点和收获、相关技术选型(为什么用 A 不用 B)
LeetCode:
- 合并两个有序链表并去除重复元素(要求时间复杂度
O(m + n)
)
4. 百度(C++/PHP/GO 研发工程师 - 小度 - 二面)
WebServer:
- 线程池是如何实现的、分为哪些步骤
- 用户 HTTP 请求是长连接还是短连接
- 如果是长连接、或者 POST 一个很大的消息怎么办(线程池中某个线程一直阻塞)
- HTTP 报文是如何解析的(在线程池还是在其他地方)
C++:
- 介绍一下
std::function
的用法和使用场景 std::move
实现原理和使用场景- 左值引用和右值引用
- 不使用
std::move
不行么(C++11/14 之前如何写代码的) std::bind
和std::function
的区别
Redis:
- ZSet 的使用场景和底层实现原理
- 为什么需要压缩列表
- 压缩列表和跳表插入的时间复杂度
- 为什么元素少的时候不直接使用跳表
Project:
- perf 底层实现原理(详细)
Expand:
- 线程池加锁
std::unique_lock
和std::lock_guard
的区别和使用场景 - 条件变量
condition_variable
中的wait
/notify_one
/notify_all
的区别 std::bind
使用场景
5. 图森未来(算法平台 - 一面)
LeetCode:
- 连通两个岛屿的最小反转次数(DFS + BFS)
- 链表数值翻倍(例如
9->9
变为1->9->8
)
6. 图森未来(算法平台 - 二面)
OS:
- 将磁盘中一个大小为 4k 的文件读到大小为 4k 的 buffer 中、操作系统发生了什么(详细)
read()
函数实现原理- 如果从磁盘读取数据有 100ms 的延迟、读取文件的进程(A)是什么状态
- 如果此时还有一个进程(B)需要做计算、两个进程是如何切换的(单核 CPU)
- 进程 A 是如何让出 CPU、进程 B 是如何拿到 CPU 的(内核源码层面做了什么)
- 内核是如何发生中断的(具体是什么中断)
- 内核是如何通知进程 B 当前 CPU 是可用的
Network:
- TCP 和 UDP 是哪层协议
- TCP 拥塞控制
- HTTP3 底层使用了 UDP、那为什么不一开始就使用 TCP
- UDP 也可以用作文件传输、那么 TCP 还有存在的必要么
LeetCode:
- 和大于等于 sum 的连续子数组个数(类似 No.560、数组元素均为正数、时间复杂度
O(N)
) - 计算
(a ^ b) % c
(不能使用pow(a, b)
做法、要求时间复杂度O(logN)
)
Offer 数量
0
更新频率
平时面试完习惯在语雀记录面经,周末会集中复盘,所以大概一到两周会更新一次凉经,更新频率和收到的面试数量强相关~
#秋招#