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

全部评论

相关推荐

学院本双非硕有一段ai初创实习经历,找暑期太难了,没有约面的,只有小红书约面了,明天面。金山的offer先接了,然后骑驴找马了。下面是面经,发出来攒人品了。1.&nbsp;自我介绍,尤其是对你的项目内容,就是你的项目经历,或者是你自己比较擅长的领域,可以展开去聊一聊。2.&nbsp;对于你这个实习或者是项目里面,你觉得哪一个点或者是你印象比较深的,你可以直接展开聊一下。说了&nbsp;tab&nbsp;补全那里的链路重构,面试官说我思路很清晰3.&nbsp;&nbsp;Google&nbsp;Adsign&nbsp;接入唯一ID,这个唯一&nbsp;ID&nbsp;是自我自己生成的吗?【实习】4.&nbsp;使用&nbsp;Redis&nbsp;加&nbsp;Lua&nbsp;分布式限流保障邮件发送治理的这个,工作内容可以展开这个聊一下吗?【实习】5.&nbsp;Redis&nbsp;+&nbsp;lua&nbsp;有什么优势?6.&nbsp;我们要实现一个微信抢红包这样的功能,你会去怎么实现这个,这个能力?回答用&nbsp;redis&nbsp;setnx+延迟队列+mq7.&nbsp;那你这种业务这个方案的话怎么去实现高并发呢?比如说同时有&nbsp;100&nbsp;个人抢这一个红包。我:不太会,就回答了加锁,然后说&nbsp;Redis&nbsp;的&nbsp;decr&nbsp;和&nbsp;incr只会扣减一,没法保证红包金额(这里一通乱答)面试官:那有没有一种更优化的方案?因为我们按刚刚的方案来说,比如说一个抢红包的一个请求过来,或者是多个抢红包请求过来,那我们一定是要用锁的形式先抢占,所以我先相当于是我抢占了这个锁,我才能去执行抢红包这个逻辑,对不对?那执行抢红包这个逻辑,这会就涉及到一个问题,如果这个逻辑比较复杂,或者是它里面计算时间比较久,就是计算&nbsp;IO&nbsp;比较久的话,所有大家都会去等待,有没有方案让我提前去,或者是有没有方案是来减少我这个计算相关的一个时延?我:不太会,回答了线程池(依旧乱答)面试官说:线程池,它也是因为你线程池,无所谓,你创建新线程,还是你拿新的,还是用线程池里面已有的线程来去做执行,它都会要等待,对吧,比如说同时我有&nbsp;100&nbsp;个人请求都来了,那你可能就得有&nbsp;100&nbsp;个线程,对吧,大家都得去等待,谁拿到这个锁,谁再去执行抢红包这个操作。我说:不太会,不了解&nbsp;cpu&nbsp;计算场景怎么优化,只知道&nbsp;io&nbsp;密集场景可以用虚拟线程面试官说:比如说我刚刚提到了一个点,就是能不能把&nbsp;CPU&nbsp;计算前置。因为我们现在这个业务场景是什么?就比如说一个红包有&nbsp;100&nbsp;个&nbsp;100&nbsp;元,我要分&nbsp;10&nbsp;份。所以说他其实对于第几个人来他其实不在意,就是说现在有或者是有抢没抢?或者是这个现在当突然有多少人来抢?其实对于红包,发红包这个事情来说,或者抢红包这个概念来说,它其实是可以预先知道每个红包分成多少钱,是不是这个事情?我:用&nbsp;Redis&nbsp;先做预热。面试官:对,那你比如说这个方案的话,我们要怎么去做呢?有一些哪些实现的细节,或者哪些数据结构呢?我:提前写死金额存在&nbsp;Redis&nbsp;里,但每份红包的金额写死不公平(此处省略一堆)面试官:涉及到公平,那你觉得怎么不公平?写死的不公平的原因是什么?=======&nbsp;后面都是对这个场景设计的探讨,此处省略跳过========8.&nbsp;了解微服务吗不了解,面试官就跳过了9.&nbsp;那我们聊一下本地事务加任务补偿怎么去?当时是怎么去实现的?【项目】10.&nbsp;发散聊一聊对于&nbsp;vibe&nbsp;coding&nbsp;相关的一些理解,或者是对于大语言模型,你最近有哪些参与度?或者是有哪些去研究的点吗?我脑子一热回答了&nbsp;openclaw11.&nbsp;你觉得它用&nbsp;Openclaw&nbsp;或者是龙虾这个东西和我们直接去使用大语言模型最直接的区别有哪些?答了&nbsp;Agent&nbsp;和大模型的区别,补充了&nbsp;skill、mcp、Function&nbsp;call12.&nbsp;那你自己又玩龙虾,主要是做了哪些?帮你辅助了哪些功能呢?回答写定时任务每天帮我拉&nbsp;github&nbsp;的热榜和股票(抄群友&nbsp;maple&nbsp;的)13.&nbsp;那其实在于你实际工作过程中,这个龙虾其实也没有发挥更多的一个所谓的私人助理这个的作用啊?我说想实现在飞书接入龙虾,然后实现&nbsp;AI&nbsp;办公14.&nbsp;你认为的在使用&nbsp;AI&nbsp;来进行办公的主要的一个业务场景有哪些呢?我说开周会,可以用龙虾去发通知啥的15.&nbsp;公司用&nbsp;golang&nbsp;进行开发,除了会&nbsp;Java&nbsp;还会啥语言我说学习了&nbsp;go&nbsp;的语法&nbsp;和&nbsp;gorm,但没学完&nbsp;grpc16.&nbsp;那你现在的学习路径是怎么样?通过什么样的方式来去学习的?我说看官方文档还有字节和七牛云的开源文档17.&nbsp;我看你这边游戏经历里面主要是玩&nbsp;MOBA&nbsp;类的,然后你还比较有感兴趣的就是他怎么支持百万人同时在线这个问题,那你自己是怎么去考虑的?我说实习的时候调研过将单机设计成联机,用&nbsp;supabase&nbsp;的&nbsp;real&nbsp;time机制18.&nbsp;对于传统的像英雄联盟也好,王者荣耀也好,它除了在局内对战,它其实还会有更多的一个游戏养成,还有一个社交的一个游戏场景。那它们两个同时支持百万在线,可能它们的一个实现模式会不太一样,这个里面有去有考虑过它们之间的不同吗?我说没考虑过19.&nbsp;那考虑到同时在百万同时在线的,除了说你刚刚有一个&nbsp;real&nbsp;time&nbsp;来实时通信,那还有一个点就是在于它同样的一个单机肯定是不可能支持这么大的一个的用户量了,它一定涉及到一个集群。你对于分布式部署有过相关的一些经验吗?我说没有,只知道&nbsp;k8s20.&nbsp;你可以理解为&nbsp;K8S&nbsp;作为一个编排容器,它就是来去做动态缩扩容的,但是我们在考虑的是为什么要分布式部署,或者是它主要能应对哪些应用场景?这个事情有了解过吗?我不会,就答了扛流量,通过负载均衡的轮询或者随机策略去访问实例之类的。然后面试官给我讲解了分布式部署,比如垂直分布和纵向分布....(此处省略一百字)反问阶段:1.&nbsp;表现面试官说:表达很好,准备很充分,思路很清晰,不用太过担心2.&nbsp;业务面试官说:组内不做鹅鸭杀,做的是小游戏品类,比如说像最近广告特别多的无尽东日,还有之前比较火的什么冒险大作战、寻道大千这一类的游戏,其实它的游戏载体是在微信或者是抖音这样的一个平台去进行一个游玩。(因为我游戏经历里写了&nbsp;moba&nbsp;类游戏,面试官又给我讲了和&nbsp;moba&nbsp;类游戏的区别)面试官说:对于我们这边的服务器开发的话,就是说从客户端的所有的链路,比如说&nbsp;Websocket&nbsp;的建立,&nbsp;Websocket&nbsp;的一个连接管理,以及所有的客户端的请求的分发处理,以及对于不同的业务模块,比如说它的排行榜模块,它的商城模块,它的匹配模块,还有一些它的所有的养成模块都需要去我们进行一个开发的和介入。面试官说:我们会以项目组的形式来进行开发,对于我们当前的组内的话,主要是人员是在&nbsp;10&nbsp;人左右,程序员是目前是在职有4位程序员,&nbsp;3&nbsp;位客户端,一位服务器开发。然后除了刚刚提到的我们要开发游戏项目内的业务功能外,同时还要去考虑到对于我们最终的服务的部署,服务的上线以及最终线上的一个问题的定位和快速的修复,就是我们现对于当前的程序员来说,他不仅仅是不会像早些年一样会区分你是一个开发,你还是一个测试,你还是一个所谓的运维。因为现在的话大部分运维就是给你直接提供云服务。给你提供云服务机器,然后对于服务内如何去搭建,如何部署,都是由我们项目内的开发人员来去完成的,所以说在我们这个游戏的或者是项目组内,如果要参与的话,其实你可以认为是从基础到上线运维到问题修复这块,其实是会有一个全面甚至是一个全方位的一个参与度的。面完两分钟后,hr&nbsp;说下午谈&nbsp;offer(史上最快.....)
查看18道真题和解析
点赞 评论 收藏
分享
评论
点赞
3
分享

创作者周榜

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