面试真题 | 华为OD C++[20260509]

非技术部分(背景、综测、HR、主管、offer)放在文首一笔带过;下文只把机考与两轮技术面写细,每道能回忆起来的题都附上可直接背诵或改写的答案

非技术相关(一笔带过)

投华为 OD。流程大致是:机考 → 性格综测 → HR 面 → 技术一面 → 技术二面 → 主管面 → 审批与邮件 offer。综测别前后矛盾即可;HR 与主管主要是自我介绍、离职原因、加班接受度、个人情况,态度正常、不踩雷即可;offer 后按清单交材料、定入职时间。机考与技术面之间我自行拖了一阵刷题,属个人节奏,不展开。

一、机考(编程)

准备:有数据结构基础,C++ 刷题约一百道(含真题风格),注意边界与溢出。当时三道题方向大致是:空间占用计算数列第 N 项「勇攀数字高峰」(读清规则后多为模拟/贪心/简单 DP)。无具体题干则不给假答案;通用策略是先易后难、样例通过后自测极端数据。

二、技术一面

2.1 项目提问(略)

按简历问上位机、与硬件通信、异常处理等,无固定标准题,此处不展开。

2.2 mapunordered_map 的区别

问: std::mapstd::unordered_map 有什么区别?什么时候用谁?

答:

  • 底层结构map 一般是红黑树,键有序;unordered_map 是哈希表,键无序(遍历顺序不确定)。
  • 时间复杂度map 查找/插入/删除多为 O(log n)unordered_map 平均 O(1),最坏在哈希冲突严重时退化(可答「接近 O(n)」,并补充好的哈希函数与 reserve 可缓解)。
  • 内存与迭代器unordered_map 常比 map 更占桶空间;unordered_map 在 rehash 时可能使所有迭代器失效map 插入删除只影响被删节点及其相邻迭代器,其它迭代器相对稳定(除被删元素)。
  • 键类型要求map 需要 严格弱序< 或自定义 Compare);unordered_map 需要 哈希函数相等比较
  • 选用:要有序遍历、范围查询、按序 lower_boundmap;只关心平均最快查找、不关心顺序unordered_map

2.3 STL 容器大致怎么分?

问: STL 里容器怎么分类?举几个例子。

答:

  • 序列容器:元素线性排列,如 vectordequelistforward_listarray
  • 关联容器:基于比较的树结构,键有序,如 setmultisetmapmultimap
  • 无序关联容器:哈希,如 unordered_setunordered_multisetunordered_mapunordered_multimap
  • 容器适配器:封装别的容器接口,如 stackqueuepriority_queue(底层多为 dequevector + heap)。

2.4 虚函数与纯虚函数

问: 虚函数、纯虚函数是什么?抽象类呢?

答:

  • 虚函数:成员函数前加 virtual,派生类可 override;通过基类指针/引用调用时,在运行时按对象实际类型解析(动态绑定),依赖 vtable + vptr
  • 纯虚函数virtual void foo() = 0;无实现(可内联定义在类外,但接口上仍表示「必须被覆盖」);含纯虚函数的类叫抽象类不能实例化,用于定义接口契约。
  • 析构函数:多态基类析构应声明为 virtual,否则 delete 基类指针指向派生对象时可能只调基类析构,派生资源泄漏。

2.5 手撕:LeetCode 567 — 字符串的排列

问: 判断 s2 中是否存在 s1 的某个排列(子串是排列)。

思路: s1 长度 m,在 s2 上维护长为 m滑动窗口,窗口内各字符出现次数与 s1 完全一致即成立。用长度 26(或 128)的 cnt 数组做差分:先统计 s1,再在滑窗中维护「还需匹配数」或「与 s1 的差向量」,匹配数为 0 即 true。

边界: m > n 直接 false

参考代码(C++):

bool checkInclusion(const std::string& s1, const std::string& s2) {
    if (s1.size() > s2.size()) return false;
    int need[26] = {};
    for (char c : s1) need[c - 'a']++;

    int win[26] = {};
    int m = (int)s1.size();
    for (int i = 0; i < m; ++i) win[s2[i] - 'a']++;

    auto same = [&]() {
        for (int i = 0; i < 26; ++i)
            if (need[i] != win[i]) return false;
        return true;
    };
    if (same()) return true;

    for (int i = m; i < (int)s2.size(); ++i) {
        win[s2[i - m] - 'a']--;
        win[s2[i] - 'a']++;
        if (same()) return true;
    }
    return false;
}

面试里可优化 same():用变量记录「当前窗口与 need 不同的字符种数」或「多余/缺少计数」,每次滑窗 O(1) 更新,整体 O(n);上面写法便于先写对再优化。

三、技术二面

3.1 static 关键字的作用

答(分场景说):

  1. 函数内静态局部变量:只初始化一次,生命周期贯穿整个程序,下次进函数保留上次的值;存储在静态/全局数据区,不是栈上每次新建。
  2. 函数外 / 命名空间内静态全局变量:C 里表示内部链接,仅本翻译单元可见;C++ 中文件作用域变量更推荐 匿名 namespace 实现同样效果。
  3. 类内 static 成员变量所有对象共享一份,必须在类外定义(除 inline 静态成员 C++17)。类内 static 成员函数:无 this,只能访问静态成员/其它静态函数,常用于单例、工厂或纯工具函数。

3.2 数组和指针的区别

答:

  • 类型int a[10] 类型是「含 10 个 int 的数组」;int* p 是指向 int 的指针。
  • sizeofsizeof(a) 是整个数组字节数(如 40);sizeof(p) 是指针本身大小(32/64 位下 4 或 8)。数组名在多数表达式里会退化为指向首元素的指针,但 sizeof(数组名)&数组名、用 char(&)[N] 绑引用等场景不退化
  • & 与步进&a 类型为指向整个数组的指针,与 &a[0] 地址数值常相同但类型不同;a+1&a+1 地址偏移不同(后者跳过整个数组)。
  • 可修改性:数组名不可被赋值改指向;指针变量可改指向。

3.3 静态局部变量、全局变量、局部变量的区别

答:

维度 普通局部变量 静态局部变量 全局变量
作用域 块/函数内 块/函数内 文件级(或 extern)
生命周期 进入块创建,退出销毁 程序全程 程序全程
默认初值 未定义(栈) 0 初始化 0 初始化(BSS)
存储区 通常栈 静态数据区 静态数据区

多线程下:静态局部变量在 C++11 起函数内静态初始化线程安全(magic static);普通全局/静态对象的动态初始化顺序在翻译单元间不确定,要小心。

3.4 局部变量都有哪些?举例

答: 最常见的是自动存储期的局部变量(函数内、块内 int x),进栈帧创建,出栈销毁。可举例:循环变量临时对象lambda 按值捕获副本(在 lambda 体作用域内也算局部相关)。C++ 里还可提 register 已是废弃 hint,实际编译器自行分配寄存器。线程里 thread_local 变量在线程内像「全局」但每个线程一份,也可顺带一提(若面试官接受扩展)。

3.5 堆和栈的区别

答:

  • 分配方式:栈由编译器自动生成/回收(栈帧);堆由 malloc/new 分配,free/delete 或智能指针管理。
  • 速度:栈分配 O(1) 移动栈指针即可;堆分配涉及,更慢,可能产生碎片。

剩余60%内容,订阅专栏后可继续查看/也可单篇购买

C/C++面试必考必会 文章被收录于专栏

【C/C++面试必考必会】专栏,直击面试核心,精选C/C++及相关技术栈中面试官最爱的必考点!从基础语法到高级特性,从内存管理到多线程编程,再到算法与数据结构深度剖析,一网打尽。助你快速构建知识体系,轻松应对技术挑战。希望专栏能让你在面试中脱颖而出,成为技术岗的抢手人才。

全部评论

相关推荐

05-07 15:38
华为_HR
谁懂啊家人们😭双非硕士+空窗快两年,本以为求职彻底凉了,没想到从机考到拿offer不到一个月,全程流程超快,稳稳上岸华为OD!📝机考4.8&nbsp;备考心得新系统比老系统友好很多,不用自己处理复杂输入输出,对刷题党太友好了!我刷了双机位C卷150道左右,最后二百出头飘过~真心建议:把双C卷完整刷完,心态稳住正常发挥,300分完全没问题!我当时太紧张,最后一题卡了一个半小时只过14%,纯心态翻车,大家千万别学我😂📌资格面&nbsp;4.13流程很常规,不用太紧张▪&nbsp;简单自我介绍▪&nbsp;聊个人基本情况、解释Gap空窗原因▪&nbsp;浅聊简历基础项目▪&nbsp;对华为、OD的认知▪&nbsp;能否接受加班、工作地点意向提前稍微背下话术,正常从容回答就行~💻技术一面&nbsp;4.23(40min)全程C++八股为主,所有知识点都会结合简历项目追问,要说清自己项目里怎么用的!面试原题:1.&nbsp;自我介绍2.&nbsp;C++类三大访问修饰符3.&nbsp;内联函数作用、适用场景4.&nbsp;抽象类&nbsp;&amp;&nbsp;纯虚函数5.&nbsp;单例模式用途+两种实现方式6.&nbsp;IDE使用技巧、常用调试方法7.&nbsp;C语言和C++异同、能不能用C实现面向对象8.&nbsp;手撕算法:快速排序💻技术二面&nbsp;4.23(20min)偏项目深挖+计算机网络,穿插少量八股面试原题:1.&nbsp;自我介绍2.&nbsp;TCP/UDP&nbsp;特点、区别、适用场景3.&nbsp;Socket&nbsp;网络编程相关知识点4.&nbsp;map&nbsp;&amp;&nbsp;unordered_map&nbsp;底层实现、异同对比5.&nbsp;手撕算法:LeetCode&nbsp;两数之和二面重点吃透简历项目,面试官会抠实现细节、底层逻辑、算法选型,一定要烂熟于心!👔主管面&nbsp;4.23离谱体验:当天技术两面结束,当晚直接约主管面,一天极限连面三轮人麻了😵▪&nbsp;自我介绍▪&nbsp;个人背景、职业规划深挖▪&nbsp;项目深度拷问(比技术面问得更细)▪&nbsp;工作意向地点、稳定性考察主管面试官全程严肃脸,不闲聊,不问技术八股,主打业务场景+方案设计+项目落地,压力感比技术面大很多,全程30分钟左右。✨上岸总结1.&nbsp;机考重点刷双C卷,心态放平别慌,不用纠结难题2.&nbsp;C++八股一定要扎实,所有知识点绑定自己项目经历回答3.&nbsp;简历项目必须吃透:原理、流程、底层、优化点全要能说4.&nbsp;主管面看重稳定性、逻辑思维、项目落地能力,真诚从容即可特别感谢我的HR香云姐🥰全程耐心负责,推进流程超快,人超靠谱,流程推得特别稳~主管面结束一周左右就下offer了,全程体验感拉满!
查看15道真题和解析
点赞 评论 收藏
分享
凌小云:实习生,第一个星期。就是把项目架构搞清楚就行。任务别急。千万不要拿自己的时间去干活。一定要让工作和生活有边界感。不要认为自己拿个人时间干活,他们知道就会觉得你很可以。你作为一个实习生,最应该的就是让他们明白你的能力边界,你拿个人时间干活,只会让他们觉得可以安排更多的任务,自己每天累死累活的,还怕任务完成不了。本身工作都不是很熟悉,千万别展示自己。一定要让自己有余力,去复盘工作,而不是每天都忙着工作里。
实习第一天,你在干什么
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

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