小红书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。

全部评论

相关推荐

03-31 20:00
中南大学 Java
点赞 评论 收藏
分享
一面已通过。1.介绍实习时的主要工作2.本科时是否做过服务端相关项目3.Java垃圾回收机制4.会存在内存碎片化之类的问题吗5.Java&nbsp;Spring的Bean的生命周期是什么样子的6.介绍Java多线程7.轻量级锁自旋失败,转换为重量级锁的过程是什么样子的8.如果要设计一个高并发的订单号生成器,要求全局唯一且可以递增,应该怎么设计9.能介绍一下上下文工程和Harness工程的区别吗10.上下文summary的策略是什么样子的11.怎么去缓解内容被压缩导致结果失真的问题12.RAG文档的分片策略是怎么样子的13.假设召回的一个片段不足以解决问题,怎么优化14.对于更深入的场景,比如文档有语义或组织关系,召回的片段可能指向别的文档,怎么优化15.了解过&nbsp;Agentic&nbsp;search&nbsp;吗16.React&nbsp;和&nbsp;Plan&nbsp;Execute模式的区别17.如果是比较复杂的场景,既需要&nbsp;Plan&nbsp;Execute,又需要&nbsp;React&nbsp;及时感知进度或外界信息并做反馈调整,这种场景需要怎么设计18.项目是否拿到上线后的测试数据19.假设项目需要升级,需要定位到具体出问题的代码,怎么做20.假设没有堆栈报错,怎么做21.现在需要做成通用平台或工具,给所有业务使用,怎么设计这样一套工具22.怎么把人在排查问题中积累的经验给到系统23.大模型的工具调用能力是什么24.MCP和Skill的区别是什么25.介绍CNN和Transformer的区别26.为什么位置编码能够体现句子中分词的关系27.为什么说模型有上下文限制28.像&nbsp;Cloude&nbsp;这种模型,上下文窗口可能只有&nbsp;200K,并不大,为什么不做得更大一些呢29.模型的参数量是什么时候定的30.为什么提供这么多不同参数量的模型31.像模型上层的&nbsp;SFT、Lora&nbsp;这些微调,之前有做过吗32.RL和SFT的区别33.RL的数据源从哪里来34.鸿蒙的&nbsp;ARKTS&nbsp;你觉得和安卓有什么区别35.它的整个应用的启动链路是怎么样的反问:岗位具体情况。答:岗位的核心课题是如何用&nbsp;AI&nbsp;赋能整个产品线,打造&nbsp;Agent&nbsp;能力,不再局限于前端、客户端或服务端某一个领域,希望具备全栈相关的能力。
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

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