小红书C++ 软件开发一面 面经
1. 自我介绍,说说你为什么想加入小红书
回答框架:
- 教育背景和技术能力
- 项目经验和技术亮点
- 对小红书的了解和兴趣
- 为什么选择这个岗位
2. 手撕算法:合并两个有序链表(保留原题)
题目:将两个升序链表合并为一个新的升序链表并返回。
答案:
struct ListNode {
int val;
ListNode* next;
ListNode(int x) : val(x), next(nullptr) {}
};
ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {
ListNode dummy(0);
ListNode* tail = &dummy;
while (l1 && l2) {
if (l1->val < l2->val) {
tail->next = l1;
l1 = l1->next;
} else {
tail->next = l2;
l2 = l2->next;
}
tail = tail->next;
}
tail->next = l1 ? l1 : l2;
return dummy.next;
}
时间复杂度:O(m+n)
空间复杂度:O(1)
3. 说说C++的智能指针,什么时候用哪个
答案:
三种智能指针:
- unique_ptr:独占所有权,不能拷贝
- shared_ptr:共享所有权,引用计数
- weak_ptr:不增加引用计数,打破循环引用
使用场景:
- 默认用unique_ptr(性能最好)
- 需要共享时用shared_ptr
- 避免循环引用用weak_ptr
循环引用问题:
struct Node {
shared_ptr<Node> next; // 会导致内存泄漏
};
// 解决方案
struct Node {
shared_ptr<Node> next;
weak_ptr<Node> prev; // 用weak_ptr打破循环
};
4. 你的项目中用到了哪些设计模式?举例说明
答案:
常用设计模式:
- 单例模式:配置管理类、日志类保证全局唯一实例
- 工厂模式:创建不同类型的对象解耦创建和使用
- 观察者模式:事件通知系统一对多依赖关系
- 策略模式:不同的算法策略运行时切换
实际案例:"我们的推荐系统需要支持多种推荐算法(协同过滤、内容推荐、热度推荐),用策略模式实现。定义统一的推荐接口,每种算法实现该接口,运行时根据配置选择算法。"
5. 如果让你设计一个图片上传和存储系统,你会怎么做
答案:
需求分析:
- 支持大量图片上传
- 快速访问和下载
- 图片压缩和格式转换
- CDN加速
架构设计:
客户端 → 上传服务 → 对象存储(OSS)
↓
图片处理服务(压缩、裁剪、水印)
↓
CDN分发
核心流程:
- 上传流程:客户端请求上传凭证服务端生成签名URL客户端直传OSS回调通知服务端
- 图片处理:异步处理:上传后放入消息队列生成多种尺寸:缩略图、中图、原图格式转换:WebP、AVIF添加水印
- 存储优化:去重:计算MD5,相同图片只存一份冷热分离:热图片SSD,冷图片HDD分级存储:按时间归档
- 访问优化:CDN加速:全球节点图片懒加载渐进式加载
安全性:
- 上传鉴权:签名验证
- 内容审核:鉴黄、鉴暴
- 防盗链:Referer检查
6. 说说TCP的拥塞控制和流量控制有什么区别
答案:
流量控制:
- 目的:防止发送方发太快,接收方处理不过来
- 机制:滑动窗口
- 接收方告知发送方窗口大小
- 点对点控制
拥塞控制:
- 目的:防止网络拥塞
- 机制:慢启动、拥塞避免、快速重传、快速恢复
- 根据网络状况调整发送速率
- 全局控制
拥塞控制算法:
- 慢启动:指数增长
- 拥塞避免:线性增长
- 快速重传:3个重复ACK立即重传
- 快速恢复:减半窗口,进入拥塞避免
区别总结:
- 流量控制:保护接收方
- 拥塞控制:保护网络
7. 手撕:实现一个线程安全的队列
题目:实现一个支持多生产者多消费者的线程安全队列。
答案:
template<typename T>
class ThreadSafeQueue {
private:
std::queue<T> queue;
std::mutex mutex;
std::condition_variable cv;
bool stopped = false;
public:
void push(const T& item) {
{
std::lock_guard<std::mutex> lock(mutex);
if (stopped) {
throw std::runtime_error("Queue is stopped");
}
queue
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。