2023级C++秋招面经个人汇总
23.3.13加上了美团后端面经
偷懒了几个月所以现在才发,只记录了一部分
趋势与网易在另外2个帖子,另外写了C++的设计题,比如手写string这种https://zhuanlan.zhihu.com/p/589795989
雷火-服务端
只记了几个没回答上的
一面选择题加最基础的八股,三次握手四次挥手那种
智力题,1024盏灯,第一次逐个电量,第二次按2,4,6…第三次3,6 9…最后几盏亮着
数据结构的前缀中缀
几个木棍凑成长度n,求出一种组合:用dp,这题出现多次了
友塔
用户游戏卡,觉得是服务器的问题,怎么排查
发牌,4个人,牌有4种色号,13个数,怎么记录每个人的手牌,占用内存尽可能小,我说用二进制,每个牌6位,但还有更优解
出现一次的数,两个出现一次的数(剑指原题)
map取下标和find的区别,底层:如果a不存在,取下标会自动赋值,有风险
芯原
问了指针的作用,const的作用
指针和引用的区别
volatile的作用
指针就是指向一块内存的变量,可以改变内存中的值。传递类指针,节约内存
const常量,希望值不变,在函数中修饰形参,表示不修改形参;修饰类函数,表示不修改成员变量;常量指针,指针常量
字节-电商-客户端
一面45min:
网络部分:
1.Https详解、http个版本区别、get和post区别,put?
2.键入url的过程-很喜欢考这个
3.tcp的差错控制,拥塞控制
系统:
1.进程调度
2.详解共享内存,管道
题目:
Z字层序遍历
二面45min:
- 如何提升媒体上传速度和成功率
- http响应报文的搭建
- 设计模式,讲几个
- 乱序数组找出所有满足前边所有数都更小,后边所有数字都更大的值,比如1 3 5 2 9的1和9
三面:
打印螺旋数组
短url转长url(设计题
用户态和内核态,多进程和多线程,上下文切换的消耗对比,进程间通信的方式
字节-视频云-客户端
一面60min:
计网和操作系统都是八股
虚函数实现拷贝构造函数
题目:改错、生产者和消费者
二面:
1.手写String
2.3个线程打印1、2、3
3.LRU
然后寄了
讯飞
一面1h:
- STL的迭代器失效(插入删除
- 页表的一个数据结构?
- 什么时候分配物理内存(读写的时候
- 拷贝构造的循环(形参必须是引用,否则会循环拷贝
- 项目中,工作线程如何发送响应报文
- 同步机制
二面:
综合面,以项目为主,问到了深度学习的项目
询问薪资期望,工作地点
招银科技-后端
一面:
1.一堆八股
- 数据库,mysql的事务的特性;一致性是什么意思(答得不好
3.项目:怎么确定是发送图片还是视频?按键+html的action字段,然后从url中来判断
二面:
说我一面面评不错,开奖也还行,应该是第二档
斐波那契数列,两种写法
递归有的函数要经常调用怎么办呢?(说了inline,写成迭代)面试官表示想说的是缓冲区,我说用数组或者哈希来存,让我在代码的递归写法下写一下,搞定了
2G数据,50MB内存,找出不重复的数(哈希分桶
华为
一面:
八股:C和C++的区别等
算法:hua**wei,删除*和左边最近的字,用栈秒了
另一道口述思路,力扣低频题,忘了具体是哪个
笔试题复盘
二面:
项目
算法:质因数的个数,秒了
C++八股,内存泄漏,多态
面试问的都是秒,然后开个13级
美团-后端开发
美团后端以Java为主,如果用其他语言去面试,就会被面试官拷打数据库。最早的一次面试,被按在地上锤
一、自我介绍,相关项目(竞赛),语言
1.python和C++的区别
python是解释型语言,先把源码转换成字节码文件,再由python虚拟机一条一条执行,和cpu之间多了解释器;
C++是编译型语言,二进制
2.python面向对象有什么特点
不知道
3.面向对象的特点
4.C++如何实现多态
虚函数,说了虚函数表和虚指针
5.C++的指针和引用的区别
解释:指针指向一块内存,内容是所指内存的地址,引用是某块内存的别名
区别:指针是实体,引用是别名
引用使用时无需解引用,指针需要
引用不可变,指针可以
引用不为空,指针可以
引用没有const,指针有
二、操作系统
1.进程和线程的区别,线程享有进程的哪些资源
进程是系统分配的最小单位,线程是调度的基本单位
进程之间相互独立,线程共享进程
进程开销大,线程开销小
2.进程的调度算法
先来先服务,最短作业优先,高响应比优先,时间片轮转调度,多级反馈队列优先
解释每个算法大概什么情况
3.什么是死锁,如何解决死锁,写一个死锁出来
互斥,持有并等待,循环等待,不可剥夺
解决方法:设置等待时间、资源顺序获取
pthread_mutex_t mutex_A = PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex_B = PTHREAD_MUTEX_INITIALIZER; void* threadA(void *data) { //获取互斥锁A,然后睡眠一秒,再获取B cout << "thread A waiting get ResourceA" << endl; pthread_mutex_lock(&mutex_A); cout << "thread A got ResourceA" << endl; sleep(1); cout << "thread A waiting get ResourceB" << endl; pthread_mutex_lock(&mutex_B); cout << "thread A got ResourceB" << endl; pthread_mutex_unlock(&mutex_B); pthread_mutex_unlock(&mutex_A); return (void *)0; } void* threadB(void *data) { //获取互斥锁B,然后睡眠一秒,再获取A cout << "thread B waiting get ResourceB" << endl; pthread_mutex_lock(&mutex_B); cout << "thread B got ResourceB" << endl; sleep(1); cout << "thread B waiting get ResourceA" << endl; pthread_mutex_lock(&mutex_A); cout << "thread B got ResourceA" << endl; pthread_mutex_unlock(&mutex_A); pthread_mutex_unlock(&mutex_B); return (void *)0; } int main() { pthread_t tidA, tidB; //创建两个线程 pthread_create(&tidA, NULL, threadA, NULL); pthread_create(&tidB, NULL, threadB, NULL); pthread_join(tidA, NULL); pthread_join(tidB, NULL); printf("exit\\n"); return 0; }
4.linux:给定一个日志文件,找出给定的一句话,并高亮:都没听说过
tail -f 日志文件 | perl -pe 's/(关键词)/\\e[1;颜色$1\\e[0m/g' # tail 从尾部查看,用于查看日志 #perl -pe 自动执行脚本
5.知道哪些设计模式?单例模式,外观模式,观察者模式。。。
6.写一个单例模式看看,为什么要加两次锁?(写反了,应该是双检测
single* single::getinstance(){ if(p == nullptr){ pthread_mutex_lock(&lock); if(p == nullptr) p == new single; pthread_mutex_unlock(&lock); } return p; }
三、数据库
1.关系型数据库和非关系型数据库的区别:
关系型数据库最典型是数据结构是表,易于维护,使用方便,支持复杂操作,但是读写性能差,灵活度欠佳,硬盘IO是瓶颈
非关系型:是一种数据结构化存储方式的集合,比如redis
格式灵活,速度快,成本低 但是 使用成本高
2.如何优化索引:
前缀索引:用某个字符串的前几个字符建立索引
覆盖索引:二级索引能查到的数据,避免回表
主键自增:追加操作,不需要移动数据
索引最好not null:难优化,null没有意义但会占用物理空间
防止索引失效:转到问题4
3.索引必须是唯一的吗
不是,唯一索引必须是唯一的,普通索引没有要求。主键必须是非空的,唯一的
4.什么情况索引会失效
左右模糊匹配,表达式、函数、类型转换,最左匹配,(漏了)where的or中左边是索引列,右边不是
5.最左匹配是什么,给定(a,b,c)
,如果只有a和c符合最左匹配吗
应该是不同的版本处理不一样,5.5版本中,a走索引,找到主键值后开始回表,到主键索引读数据行,然后作对比c;5.6之后有一个索引下推过程,可以在索引遍历过程中,对索引包含的字段先判断,直接过滤掉不满足条件的记录,减少回表次数)
6.性别能作为索引吗
不行,区分度太小,如果索引的区分度小,优化器会进行全表扫码
四、redis
1.redis的数据结构
1.1有序集合和无序集合各能实现什么功能,说一下如何实现 ——没用过啊
有序集合:排行榜;实现:可能想问redis的指令? 新增可以使用ZINCRBY
查看最大的可以用ZREVRANGE
无序集合:点赞;实现:key是文章id,value是用户id
拓展:共同关注,抽奖
1.2有序集合的底层:快表,快表的结构
2.redis为什么快,redis为什么单线程但还是很快:IO多路复用
基于内存,高并发,单线程避免多线程的竞争,也不会导致死锁,IO多路复用
3.雪崩、击穿、穿透什么什么,如何解决:
雪崩:大量缓存数据在同一时间过期,或者Redis故障宕机,有大量用户请求
方法:均匀设置过期时间,设置过期时间时加上一个随机数
击穿:热点数据过期
方法:互斥锁,保证同一时间只有一个业务线程更新缓存
不给热点数据设置过期时间,后台异步更新缓存→ 如果热点数据一直不过期,但失去热度怎么办(差不多这意思,因为一开始只说了不设置过期时间,没有说后台更新要更新缓存)或者在热点数据要过期前,提前通知后台线程更新缓存以及重新设置过期时间
穿透:既不在缓存也不在数据库
限制非法请求;缓存为空或默认值;布隆过滤器如何快速判断数据是否存在→怎么设计布隆过滤器?不会
4.如何保持数据库和缓存的一致性
旁路缓存
写:先更新数据库再删除缓存
读:先读缓存,如果未命中则去数据库中读,并写到缓存中
如果对缓存命中率有要求,则先更新数据库,再更新缓存。但这样会有不一致的情况,所以可以1,更新缓存前加上分布锁。2,更新完缓存后,给缓存加上较短的过期时间,即使有错也能很快过期
五、情景
40亿数据,给一个数字,查找是否在里边:
bitmap
位图
40亿数据需要40亿bit,大约500MB内存,用bit来表示这个数据是否存在,1表示存在,0表示不存在,时间复杂度O(n)
具体:读入40亿个数,设置对应的bit位,再输入要查询的数,查看对应的bit位是否为1
计算$4010^9 /8/10^{-3}=510^5KB=500MB$
算法:
寻找峰值:二分,要考虑边界
二叉树的层序遍历,用迭代做了
#如何看待2023届秋招##面经##秋招##春招##23届找工作求助阵地#