华为OD 二面面经 C++

1.自我介绍

指针

2.说一下三种智能指针和它们的特点

unique_ptr:同一时间内只有一个智能指针可以指向该对象

shared_ptr:多个智能指针可以指向相同对象,强引用

weak_ptr:配合 shared_ptr 使用,防止两个 shared_ptr 互相引⽤导致资源永远不释放(引用计数永不为0)

3.shared_ptr是通过什么方式实现的

引用计数。引用时增加计数,销毁时减少计数,计数为0时释放资源。

4.const int * 和int * const

const int * 指向整型常量的指针,它指向的值不能更改

int * const 指向整型的常量指针,它不能再指向别的变量

面向对象

5.面向对象的三大特性

封装、继承、多态(多态突然想不起来,面试官提醒后想起来了)

6.析构函数为什么一般写成虚函数

假如一个基类的指针指向一个派生类的对象,如果析构函数不是虚函数,销毁时会调用基类的析构函数,派生类的自身内容就不会被析构,会导致内存泄漏。如果析构函数是虚函数,则会根据指针所指对象的虚函数表执行派生类的析构函数,再执行基类的析构函数。

STL

7.vector的扩容机制

添加元素时,会判断当前是否还有剩余空间,如果没有则会进行扩容,将内存拷贝到新申请的内存空间上,并且释放原先的内存。

8.有了解过vector扩容会扩多少吗

没有(面试官说是扩到原来的两倍,不过面试结束后我去查说是跟环境有关,不一定是两倍)

9.假如已经创建了一个vector,现在有两种情况,第一种是确定vector中有10000个元素,第二种是确定vector中最多有10000个元素,为了绕开自动扩容机制,应该怎样处理(问题经过简单修改,最开始怎么问的我忘了,我最开始答的使用push_back和emplace_back)

第一种情况使用resize(),二种情况使用reserve()

10.resize()和reserve()的区别

resize()改变当前容器内元素的数量

reserve()改变当前容器的最大容量

11.假设最开始vector中有两个元素,resize(10000)和reserve(10000)之后调用size()返回值是多少

10000

2

12.刚才你提到了push_back()和emplace_back(),区别是什么

push_back() 向容器尾部添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中(如果是拷贝的话,事后会自行销毁先前创建的这个元素);而 emplace_back() 在实现时,则是直接在容器尾部创建这个元素,省去了拷贝或移动元素的过程。

设计模式

13.讲讲最常用的单例模式是怎么实现的

①类中包含⼀个静态成员指针,该指针指向该类的⼀个对象,提供⼀个公有的静态成员⽅法,返回该对象指针;

②为了使得对象唯⼀,构造函数和拷贝构造函数设为私有。

手撕代码

一道与***************类似的题

硬币。给定数量不限的硬币,所有币值为一个数组,编写代码计算n分有几种表示法。

int count(int amount,vector<int>&coins){
    int coins_num=coins.size();
    vector<vector<int>>dp(coins_num+1,vector<int>(amount+1,0));
    int l=coins.size();
    for(int i=0;i<l;++i){
        dp[i][0]=1;
    }
    for(int j = 0;j<coins_num;j++){
        for(int i=1;i<=amount;i++){
            for(int k=0;k<=i/coins[j];k++){
                dp[j+1][i]+=dp[j][i-k*coins[j]];
            }
        }
    }
    return dp[coins_num][amount];
}

面试官看完之后说我这个逻辑上没问题,递推式也没问题,但时空复杂度都比较高,跟我仔细地分析了代码可以优化的地方

int count(int amount,vector<int>&coins){
    int coins_num=coins.size();
    vector<int>dp(amount+1,0);
    int l=coins.size();
    dp[0]=1;
    for(int j = 0;j<coins_num;j++){
        for(int i = coins[j];i <= amount;i++){
            dp[i]+=dp[i-coins[j]];
        }
    }
    return dp[amount];
}

总体来说面试官很好,没有给太大压力,整体氛围很轻松。

最后也给了我建议(动态规划是我的软肋,最好要克服)

7.27更新

主管面+HR面

两场面试放到同一个会议里了,基本上大方地说就没问题了

谈谈你为什么想来华为

讲讲毕设

平时怎么学习

基本上就是聊天,放开些

我跟主管说我想多加班多拿些,主管说现在控制加班

然后HR又跟我说加班可能很多,周末加班有双倍工资

看来双倍工资是没得拿了

ps:这两轮面试一般会谈薪资,可以事先调查一下

7.31

走审批了

薪资给了定级范围的拉满(虽然定级可能没有到达预期,不过我的动态规划确实不太熟练,一面表现也不太好)

8.2

OC

#23届找工作求助阵地#
全部评论
大佬写的很好,想问一下过了吗?
点赞 回复 分享
发布于 2023-07-21 10:37 香港
华为南京研究所数通找人啦!HC多多,部门氛围好,欢迎投简历~
点赞 回复 分享
发布于 2023-07-25 10:21 贵州
谈薪大概多久能出结果?
点赞 回复 分享
发布于 2023-10-18 23:35 陕西

相关推荐

秋招进行到现在终于能写总结了。完全没想到战线会拉这么长,过程会如此狼狈,不过更应该怪自己太菜了。好在所有的运气都用在了最后,也是有个去处。背景:双2本硕科班,无竞赛,本科一段研究所实习,硕士一段大厂暑期实习但无转正。技术栈是C++&nbsp;&amp;&nbsp;Golang,实习是客户端音视频(而且是鸿蒙端开发),简历两个C++项目一个Golang项目。主要投递岗位:后端,cpp软开,游戏服务端,测开,以及一些不拘泥于Java的岗位。从8月起总共投递123家公司,笔试数不清了,约面大约30家。offer/oc/意向:友塔游戏(第一个offer,面试体验很好,就是给钱好少南瑞继保(计算机科班点击就送(限男生),不...
乡土丁真真:佬很厉害,羡慕~虽然我还没有到校招的时候,也想讲一下自己的看法:我觉得不是CPP的问题,佬的背书双2,技术栈加了GO,有两段实习。投了123,面了30.拿到11个offer。这个数据已经很耀眼了。这不也是CPP带来的吗?当然也不止是CPP。至少来说在这个方向努力过的也会有好的结果和选择。同等学历和项目选java就会有更好的吗?我个人持疑问态度。当然CPP在方向选择上确实让人头大,但是我觉得能上岸,至于最后做什么方向,在我看来并不重要。至于CPP特殊,有岗位方向的随机性,java不是不挑方向,只是没得选而已。也希望自己以后校招的时候能offer满满
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-24 20:55
阿里国际 Java工程师 2.7k*16.0
程序员猪皮:没有超过3k的,不太好选。春招再看看
点赞 评论 收藏
分享
评论
17
100
分享
牛客网
牛客企业服务