别人面试经验

第一位

说实话,我之前以为字节的面试会很难很难. 但事实上我觉得非常简单. 不知道是我最近面试的很多的原因.我只是一个二本院校毕业的电子专业的.工作经验3年.代码编程什么的都是自学的,学校也不教这个东西.而且我不擅长八股和leetcode上刷题.
那为什么我觉得字节面试的很简单呢. 是因为他问的都是比较浅薄的C++知识.至少我是这么觉得的.因为很多问题可以继续追问到汇编和编译层面的东西.比方说跟我在欧特克的面试比起来,字节就显得相当简单了.但是字节问的更多的项目上和实际上用到的东西,比方说崩溃,多线程处理,内存溢出之类的问题,可能更贴近实际操作上的东西.
到现在我三面都过了. 等着HR 回头给我最后一面就行了.
我学历低,离职率也比较高,HR也很有可能给我挂掉.所以能不能最终拿到offer也不好说.

下面是面经:

一面:三四十分钟左右
问项目的东西,项目用到的东西
1.问了线程锁的相关内容
2.问了QT信号槽的机制, 和线程安全方面的问题(多线程连接用直连会怎么样..)
3.设计模式 让我手写了一个饿汉. 我是用伪代码写的...
3.1 然后问我怎么样可以让他线程安全
4.手写算法是 二叉树的最小深度
5.知道我封装过SDK. 问我做SDK要注意什么东西.
5.1 SDK申请内存是交给外部还是内部,他们要注意的地方.
5.2 动态库的加载的两种方式,他们的优缺点
5.3 动态库加载失败的几种可能
6. vector容器的 逻辑. 他的拷贝是怎么样子的
7. share_ptr的实现大概逻辑是怎么样子的
8. 遇到内存泄漏是怎么排查处理的
9. 遇到崩溃问题是怎么排查处理的
10. 以前遇到的什么问题是比较有挑战,并且什么怎么解决的.
11. 有没有用过其他的GUI框架
12. eletron和qt开发的区别
13. 有没有用过opengl,opencv的东西

我来开卷答一下:
1、线程锁:我觉得主要线程数据之间的同步及互斥问题。
互斥锁:同一时间只能有一个线程访问。会导致线程切换。
读写锁:读锁时其他读请求可以访问,写请求不可访问;写锁时,其他读写请求均不访问。
递归锁:解决在递归场景下锁被多次lock的情况。
自旋锁:在一个线程占用锁时,其他请求自旋等待。不会导致线程切换,导致cpu利用率飙升。
条件变量:
资料:
https://lwn.net/Articles/360699/
https://www.bilibili.com/video/BV1YU4y1a7x1/?vd_source=554b559ba6e5104d928b5dbd65b9e0ce
https://blog.csdn.net/qq_42282862/article/details/130812720
2、qt信号槽应该是最重要的性质了。
3、应该指的是单例模式的饿汉。单例主要有饿汉模式和懒汉模式。以下三种实现都是线程安全的。
/// 饿汉模式 存在内存泄漏
class Singleton {
public:
  static Singleton* getInstance() {
	  cout << "func::getInstance" << endl;
    return instance;
  }

private:
  Singleton(){
  	cout << "func::Singleton" << endl;
  }
  ~Singleton(){
  	cout << "func::~Singleton" << endl;
  }
  static Singleton* instance;
};
//// initialize
Singleton* Singleton::instance = new Singleton();



//懒汉模式 存在内存泄漏
class Singleton{
public:
  static Singleton* getInstance() {
    if (instance == nullptr) {
        mtx.lock();
          if  (instance == nullptr) {
            instance = new Singleton();
          }
        mtx.unlock();
        return instance;
    }
    return instance;
  }

private:
   Singleton(){
  	cout << "func::Singleton" << endl;
  }
  ~Singleton(){
  	cout << "func::~Singleton" << endl;
  }

  static Singleton* instance;
  static mutex mtx;
};

  Singleton* Singleton::instance = nullptr;
  mutex Singleton::mtx;


//利用局部静态变量线程安全的性质实现 无锁版本(懒汉模式),无内存泄漏
class Singleton{
public:
  static Singleton& getInstance() {
    static Singleton instance;
    return instance;
  }

private:
   Singleton(){
  	cout << "func::Singleton" << endl;
  }
  ~Singleton(){
  	cout << "func::~Singleton" << endl;
  }
};

4、leecode的题就不多说了。https://leetcode.cn/problems/minimum-depth-of-binary-tree/description/
5、我没有开发过SDK,我理解内存一直还是应该遵循谁申请谁释放的原则。动态库和静态库的区别:从加载次数、加载时间等角度。
6、vector作为容器有着动态数组的功能,当加入的数据大于vector容量(capacity)时会自动扩容,系统会自动申请一片更大的空间,把原来的数据拷贝过去,释放原来的内存空间。一般1.5倍。
7、首先share_ptr是一个类模版,然后成员变量有T* 指针、mutex(用于线程安全计数,指针)、num(指针);成员函数有普通构造函数、拷贝构造、析构函数、赋值函数、重载"="、"*"、"->"等。
https://blog.csdn.net/Arthur__Cui/article/details/131969612
8. 遇到内存泄漏是怎么排查处理的(主要指堆)
原因:调用分配与释放没有符合开闭原则,没有配对,形成了有分配,没有释放的指针,从而产生了内存泄漏。
后果:内存泄漏的排查就变得极为头疼,一个程序,其虚拟内存一直在增长,无法准确判断是程序需要还是内存泄漏。有分配没释放,自然使进程堆的内存越来越少,直到耗尽。会造成后面的运行代码不能成功分配内存。甚至使程序OOM。
工具:valgrid、mtrace等
其他方式:review代码、日志
避免:智能指针、避免在堆上分配、malloc/free、new/delete、RAII等
https://www.zhihu.com/question/63946754/answer/2973245260
9. 遇到崩溃问题是怎么排查处理的,也是遇到core
有core文件:通过gdb调试找到具体代码行
无core文件:可以通过dmesg方式找到堆栈信息,然后addr2line找到代码行
其他方式:review代码、日志等

10. 以前遇到的什么问题是比较有挑战,并且什么怎么解决的.
https://www.jianshu.com/p/b97607575c0c
https://www.zhihu.com/question/607579809/answer/3082357435?utm_id=0
11. 有没有用过其他的GUI框架: 我做后端也不用gui啊
12. eletron和qt开发的区别: 不懂
13. 有没有用过opengl,opencv的东西: 不懂

二面:50分钟左右
简单自我介绍。简单问了点项目的东西,
从项目上看我经常用qt,考我信号槽(我直接把信号槽原理, moc机制,元对象机制,信号槽的实现方式都说了一遍)
问虚函数(我从编译的角度以及虚函数在运行的时候的实现方式都说了一遍)
move函数的作用( 从右值引用的地方开始引入来解释这个move,以及他的效率和作用部分来解释)
提问多线程是怎么处理的:我先说用互斥等。。 他提问怎么做到线程同步的。
锁(会让你手写锁的, 我写了一个递归死锁,一个多线程死锁, 还问我怎么改这个递归死锁,我说直接用递归锁就行了,还介绍到我会用读写锁,)
问了很多内存泄漏的处理。怎么预防等等。。 (后面我提问的时候知道这个小组设计到图形算法处理的部分,有比较多内存泄漏的地方)

我来开卷答一下:
1、qt就不说了
2、虚函数表和虚函数表指针
* 虚函数表:在编译期间创建。编译器会为每个类确定好虚函数表(vtbl)的内容。
* 虚函数表指针虚函数表指针跟随着对象,在运行期间创建。由于在编译期间编译器为每个类创建好了 vtbl,并且编译器会在类的构造函数中插入将虚函数表的地址赋值给虚函数表指针的隐藏代码,所以对象只有在运行期间才能获取到虚函数表指针的内容。
* 虚函数表VTABLE,存放的是函数指针的数组。
* 一个类只有一个VTABLE,不管有多少个实例。
* 派生类有自己的VTABLE,与基类具有相同的函数排列顺序。
* 在实例时 增加vptr字段指向类的VTABLE,且存在实例的首四个字节。
* 如果派生类没有重写基类的虚函数,基类和派生类的虚函数表指向的函数地址都是相同的,虚函数表是不同的。
* 多继承、派生类有多个虚函数表,虚函数的排列顺序和继承顺序是一致的。
https://zhuanlan.zhihu.com/p/629281871
3、move作用主要可以将一个左值转换成右值引用,从而可以调用C++11右值引用的拷贝构造函数,在对象拷贝的时候,在运行时,它们不会产生一行代码原先的对象也会清空, 可以减少资源创建和释放。作为可以归纳为以下几点:
* std::move函数可以以非常简单的方式将左值引用转换为右值引用。
* 通过std::move,可以避免不必要的拷贝操作。
* std::move是为性能而生。
* std::move是将对象的状态或者所有权从一个对象转移到另一个对象,只是转移,没有内存的搬迁或者内存拷贝。
两个地址是独立的,move操作实际上是系统将这一块地址属于哪一个地址的登记改一下,实际上这一块内存根本没有发生任何变化。
4、提问多线程是怎么处理的:我先说用互斥等。。 他提问怎么做到线程同步的。
进程内多线程共用进程地址空间,因此进程的数据每个线程都能访问。线程要如何保证同步,通过互斥锁、自旋锁、原子操作、信号量等实现。
5、锁(会让你手写锁的, 我写了一个递归死锁,一个多线程死锁, 还问我怎么改这个递归死锁,我说直接用递归锁就行了,还介绍到我会用读写锁,)
知识点有:futex等

手写算法题:
两个链表相加

三面:一个小时
其实跟二面一样.问我项目,然后从项目问我东西.
遇到crash是怎么处理的
内存溢出是怎么处理的.尤其是栈溢出是怎么处理的呢.
技术上的东西问的很少.而且我觉得问的很简单..
简单问我指针是什么...
都特别简单, 简单到我没有什么印象了.
然后我问暂时的职业规划.未来的发展方向
然后聊了一会 就开始写算法题了
这个算法题是 从集合里面输出所有的子集:
这个我leetcode上很久以前写的 只有一点点影响.而且这个面试官会问你是怎么思考的,并且在你回答思考的逻辑给你提示和提问. 总的来说就是在那写之前是有一个讨论的.我拼命回忆以前做的这道题.发现驴头不对马嘴..我就换了个思路 我自己想.自己写.我说出我的思路. 然后面试官说:emm我觉得你说的可行.那你就照着这个思路写吧.然后慢慢的就写出来了,因为***上的网页面试,是可以运行的. 写完之后自己试了一下输入输出没有问题就差不多了.

内存溢出OOM(out of memory):系统中存在无法回收的内存或使用的内存过多,最终使得程序运行要用到的内存大于能提供的最大内存。此时程序就运行不了,kill进程。
栈溢出:1、递归太深,修改非递归;2、栈上占用内存太多,修改用堆。3、增大堆栈大小值

2021/10/12号 更新记录
好气....我三面都面完了,都准备接下来HR面试,然后入职了.
HR告诉我,我的简历被隔壁的剪映部门看上了,leader准备找我谈谈.
应该是因为我以前一直做过QT客户端的开发,跟剪映的这个部门对得上.
好家伙,得重新面试了.

剪映部门:
四面:
一面比较简单,问的问题都是基本的C++问题跟上面的差不多.
有一个我回答错了:
他给了很多类,让我说出来类的大小:(大概是下面这样的)
class A
{}

class B
{
public:
virtual void fun1();
int a;
char b;
}

class C
{
public:
virtual void fun2();
}

class D : public B
{
int c;
}

class E : public B, public C
{

}
class F : public B, public C
{
virtual void fun3();
}

class A=1
class B=16
class C=8
class D=24
class E=24
class F=24

我回答F的大小的时候错了.
还问了STL map和unordered_map的区别,我简单说一个是红黑树一个是哈希表
反问我unordered_map是怎么解决哈希冲突的.(我没有回答上,我说我知道怎么解决哈希冲突,但是我没有深层次的了解unordered_map底层是怎么解决哈希冲突的)
其他的比较简单哈. 我都记不住了;

算法题刚开始让我手写一个 线程安全的单例模式,(我回答之前的面试问过啦)
然后换了一个 两个大数字的string类型相加,我哼哧哼哧给写出来了.
他读了代码.有几个细节跟我交流然后改好了.
面试官说思路没有问题.
这次的面试就算过了

本来我以为这个技术面都结束了,结果第五面还是技术面(这次的面试难度一下就上来了,我表现的非常不好)
先问一下项目和工程的东西
最近一两年最大的收获是什么
怎么用dump信息的.
怎么处理内存泄漏的
以前的项目测试是怎么测试的
Qt的元对象机制
windows与mac的不同(文件系统怎么不同,qt的UI处理上有什么不同)
windows下的消息循环是什么样子的
Qt的窗口刷新机制是什么样子的
Qt下 父类和子类的窗口刷新机制是怎么样子的
Qt下 兄弟类的刷新机制是怎么样子的
Qt下 兄弟类互相被遮盖的地方,他们的刷新机制是怎么样子的
(上面一大串问题给我整懵了,好多不会....)
Qt下的线程有哪些方式(还问了Qfetch..)

然后问了C++的东西
class A
class B
{
A a;
}
上面这个代码有什么问题?
多继承的时候,虚函数表什么怎么处理的
多继承下会遇到哪些问题(我说重名函数会有问题,他问那要怎么解决呢)
C++ 下的int大小,然后long int大小,double大小(分别问32位和64位下的大小都问了)(我没回答上,给我整忘了...)
问我用过QML没有.

其实好多没有回答上来,回忆下来大概就这些个问题.
等着HR 给我回复吧....(大意了..我以为这个是HR面试,我都没有准备什么东西)
这次的面试没有要写算法题, 但是前前后后也问题了大概四五十分钟的样子.

第二位

211本 工作两年半 一直在写C++

面试部门
字节跳动上海穿山甲团队

面试时间
10.20-11.14

一面
算法题:LRU缓存实现,要求set\get操作o(1)时间复杂度,leetcode有原题

技术问题:

TCP滑动窗口
浏览器访问baidu.com的过程
https原理
epoll实现原理,和poll的对比
关于kafka的一个小问题
TCP握手挥手细节(特别细...)
MYSQL存储结构,主键索引和非主键索引在MYSQL中是如何存储、查找的
二面
算法题:一个N位数K,从N位中去掉M个数字,使剩下的数字最大,leetcode有类似题

技术问题:

SQL聚合查询语法(这个忘了竟然- -||)
一个SQL语句的执行过程
TCP拥塞控制
rb-tree和b+-tree的区别,INNODB为什么用b+-tree
给了两个事务,问在各种隔离级别下的执行结果
MVCC原理
ACID的涵义,MYSQL是如何保证的
三面(偏业务面)
算法题:单链表排序

(聊了很长时间的项目经验,问了啥问题已经是想不起来了...)
技术问题:

redis sds实现
缓存失效的几种场景,以及解决方案
四面(leader面)
算法题:二叉查找

技术问题:

goroutine的实现
缓存雪崩、击穿的解决方案
如何排查线上程序问题
protobuf为什么快
epoll原理
分布式系统优缺点,一致性是如何保证的
MYSQL存储结构
CPU寻址过程,cache miss,TLB,页表...
在linux上执行ls操作系统做了什么(这个在6.S081上看过,刚好会,哈哈)
职业规划,愿意转go吗
总结感受
字节面试流程还是比较快的,HR比较积极
前两轮面试感觉不是特别好,http协议这块是真的不熟悉,说实话前两面给我不过我都是可以接受的,但leader面我觉得可以给自己打个90分
面试官人都很不错,状态很轻松
每一轮基本都是自我介绍,项目经验,技术问题,算法题这个流程,每轮时间1个小时,算法题半小时
字节社招的算法题基本都是leetcode中等以下难度的,我这四轮感觉是2easy 2medium

第三位

第一次面试实在紧张死了,一边嘴瓢一边忘词
一面 30min
十亿个用户id怎么去重?
用两个栈实现一个队列
c++语言
1、一个结构体有一个int一个char,sizeof是多少
2、虚函数的原理(越详细越好)
3、虚表什么时候产生?虚表指针什么时候被初始化?
4、讲一下inline函数
计算机网络
1、TCP和UDP的区别
2、数据是先到交换机还是路由器
3、http访问过程。https?
4、三次握手第三次丢了怎么办?
5、四次挥手的状态?为什么有TIME_WAIT?
二面 1h20min
问题很多但是比较常规,也很多追问。以下是我凭记忆整理出来的。我把答的不好的答案写出来了,求轻喷。
1、知道纯虚函数吗,和虚函数各自是怎么工作的?
纯虚函数是抽象类提供的接口,子类定义了这个函数才可以被实例化。
2、虚函数具体怎么实现多态?
扯了一堆c++内存模型的东西
3、vptr放在对象的哪个位置?
4、子类是怎么找到对应虚函数的入口指针的,为什么不会调用到父类的虚表?
我答的是子类继承的时候会修改父类的虚表对应的表项
5、构造函数能为虚函数吗,析构函数呢?
6、讲一讲复制构造函数吧
(1)什么时候调用复制构造函数?
(2)什么时候需要你手动写一个复制构造函数呢?什么时候编译器会为你合成一个复制构造函数呢?
如果类成员有new出来的变量,浅拷贝有可能造成内存泄漏。对于第二个问题在类展现bitwise semantics的时候并不会合成,当类中的成员类有自己定义的复制构造函数时,类实现了虚函数时,或者类
实现了虚拟继承时不表现bitwise semantics此时编译器会合成一个复制构造函数(这一段答的很混乱,对象模型那本书还得好好看,被问细节真的好紧张)
7、讲一下智能指针
8、weak_ptr用来解决什么问题?怎么解决?
9、说说lamda表达式的捕获有几种?
只记得值和引用捕获...(昨天才学习的一紧张给忘了)
10、聊聊左值和右值吧
11、如果一个函数形参是左值引用能否接受一个右值?
左值引用不能绑定到右值。但是常量左值引用可以(追问为什么?答曰 右值一定是一个const&,const&不一定是右值 不知道对不对)
12、右值引用能接受左值吗?
13、声明一个右值引用给他赋值如Data && p1 = std::move(p),p1是左值还是右值?
14、万能引用了解过吗?怎么保持其引用类型不变?
完美转发(脑子里只有这个词了)
15、讲一下static关键字
局部变量 、全局变量、函数、类成员函数、类成员变量各自用static声明时的行为
16、讲一下extern C
17、重载是什么,只改变返回值是重载吗?

算法题20min
1、给一个无序数组和target,从数组中找到3个数,这3个数的和与target最为接近。假设有唯一解。
用双指针,面试官说还有时间来写一道构造函数题吧(我:。。。)
2、给一个类,成员变量有int和char*,重载他的赋值运算符
注意比较this和形参的地址,注意释放赋值之前的地址

反问:
我需要改进的地方?

三面(1h)
二面完就收到了三面通知
1、一个类对象的指针赋值成nullptr能调用成员函数吗?虚函数呢?为什么?
2、算法题
为一对标签。一个字符串内有很多这样的标签比如




"非法字符串" //非法

"d层次中的字符串" //合法



成对标签之间可以有字符串,字符串上一层和下一层必须是成对标签
判断其是否合法并生成一棵树表示其层次结构(节点自己定义)

这一个题能顶三个题的代码量啊
写了一个小时没写完。。。我下来写完发面试官邮箱了
居然没问操作系统也好奇怪
许愿hr面

3.21更新:
通过啦!!!

3.23更新:
收到offer啦!!!

从三面到offer差不多一个多星期,三面的算法题当场没做出来,整个表现属于是被完美打中知识盲区了。之后官网的校招进度一直没变过,所以一直是处于心虚但是又不敢直接打电话催的尴尬状态,学习也学不进去,游戏也玩的不爽,主要是游戏玩的不爽。

在牛客刷面经真的帮助了我很多,虽然越刷越焦虑,但是越刷也越有动力!希望牛友们都能收到理想的offer!

第四位

一面 65min
一开始就是介绍一下项目,阐述一下做这个项目的原因跟设计思路,然后是开始问问题。
项目中内存池的作用,有什么好处,讲一讲是怎么设计这个内存池的。
在写raft协议的时候,有没有遇到什么困难,怎么解决的。
TCP UDP区别,分别适合什么场景。
TCP拥塞控制。
SELECT EPOLL。
线程的共享资源和私有资源。
C++内存模型。
C++多态。
Linux软连接和硬链接。
然后手撕了一个跟二分相关的题目。
总之一面还是问八股比较多,也符合我的认知,主要就是考察基础知识。

二面 80min
先问了一下项目现在的开发进度。
问了一下如果要优化你的项目,怎么去找优化的地方(怎么找到性能瓶颈)。
内存池的设计,有没有去测试性能会提升多少。
各个模块的性能测试有做吗,时间大概都是什么量级的。
C++静态函数能不能访问非静态成员变量,如果是给他传一个对象呢。
栈申请对象快还是堆快,为啥。
malloc的对象直接delete,程序会崩溃吗。
new 数组 不用 delete[] 什么东西会泄露。
rand5 实现 rand7
手撕力扣844,写完问了一下复杂度。
二面问了很多项目细节的问题,特别是性能跟测试相关的东西。

三面 120min
怎么去决定项目中的存储结构的,有什么考量。
实现了内存池,怎么去测试性能。
面试官说如果是线上的一个系统,怎么直接用线上数据来进行测试。
设计一个系统要考虑的指标有什么。
如果用户说,访问服务的时候偶尔会延迟,怎么去找问题。
看日志里的什么指标,怎么定你要看的指标。
CPU的占用率,百分比的分子分母分别是什么。
内存池跑在32位系统和64位系统上可能会有什么问题。
内存池会不会无限扩展。
回收内存的时候,如何确定回收的块的大小。
用Gtest有没有觉得他什么问题。
你设计数据库的话,如何保证事务的原子性。
问我有了这undo和redo日志有没有可能还是会有问题,然后问我这俩日志的写入顺序。
最后手撕了一个类似括号嵌套匹配的问题。
三面面试官是leader,问的都是些场景题,完全没有八股文。

很多情况下,都是他抛出一个问题,然后我们两个人一起讨论,阐述看法,一起去解决这个问题,然后不断的去扩展,面试官人很nice,面试体验非常好。

来源:
https://www.cnblogs.com/hayaizo/articles/17655373.html
https://leetcode.cn/circle/discuss/0EjxB3/
https://www.nowcoder.com/discuss/497882572182003712?sourceSSR=search
https://zhuanlan.zhihu.com/p/556898294

posted @ 2023-10-10 22:00  小海哥哥de  阅读(101)  评论(0编辑  收藏  举报