小红书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. 你的项目中用到了哪些设计模式?举例说明

答案:

常用设计模式

  1. 单例模式:配置管理类、日志类保证全局唯一实例
  2. 工厂模式:创建不同类型的对象解耦创建和使用
  3. 观察者模式:事件通知系统一对多依赖关系
  4. 策略模式:不同的算法策略运行时切换

实际案例:"我们的推荐系统需要支持多种推荐算法(协同过滤、内容推荐、热度推荐),用策略模式实现。定义统一的推荐接口,每种算法实现该接口,运行时根据配置选择算法。"

5. 如果让你设计一个图片上传和存储系统,你会怎么做

答案:

需求分析

  • 支持大量图片上传
  • 快速访问和下载
  • 图片压缩和格式转换
  • CDN加速

架构设计

客户端 → 上传服务 → 对象存储(OSS)
                ↓
        图片处理服务(压缩、裁剪、水印)
                ↓
            CDN分发

核心流程

  1. 上传流程:客户端请求上传凭证服务端生成签名URL客户端直传OSS回调通知服务端
  2. 图片处理:异步处理:上传后放入消息队列生成多种尺寸:缩略图、中图、原图格式转换:WebP、AVIF添加水印
  3. 存储优化:去重:计算MD5,相同图片只存一份冷热分离:热图片SSD,冷图片HDD分级存储:按时间归档
  4. 访问优化:CDN加速:全球节点图片懒加载渐进式加载

安全性

  • 上传鉴权:签名验证
  • 内容审核:鉴黄、鉴暴
  • 防盗链:Referer检查

6. 说说TCP的拥塞控制和流量控制有什么区别

答案:

流量控制

  • 目的:防止发送方发太快,接收方处理不过来
  • 机制:滑动窗口
  • 接收方告知发送方窗口大小
  • 点对点控制

拥塞控制

  • 目的:防止网络拥塞
  • 机制:慢启动、拥塞避免、快速重传、快速恢复
  • 根据网络状况调整发送速率
  • 全局控制

拥塞控制算法

  1. 慢启动:指数增长
  2. 拥塞避免:线性增长
  3. 快速重传:3个重复ACK立即重传
  4. 快速恢复:减半窗口,进入拥塞避免

区别总结

  • 流量控制:保护接收方
  • 拥塞控制:保护网络

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。

全部评论

相关推荐

02-16 01:39
南昌大学 Java
坚持无悔意无休:xhs上集美最爱说谎博人眼球
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务