秋招总结04:华为
华为一面 1h
-
自我介绍
-
做手撕代码:
超大容量背包-01背包变形 背包容量10的九次方,物品数量20,不能两重循环,可以采用暴力dfs做复杂度2^n,其中n=20,满足复杂度要求
后续面试官又追问了一下n=40该如何处理,面试时没想出来,面完百度了下采用折半枚举法
https://www.cnblogs.com/qwertiLH/p/8320078.html -
string和char的区别
-
编译原理, 从源文件到可执行文件的过程(讲了四个阶段,以及静态链接和动态链接)
-
动态链接所有的段都只是一份吗(个人认为是只有代码段是一份的, 因为数据的话对于每个进程是私有的,不共享)
-
.data 和 .bss的区别, 只用.data不可以吗, .bss段的一个好处(主要的好处, bin文件可以变小,.bss段只存储变量名和长度信息不实际开辟空间)
-
函数的堆栈过程
-
介绍内联函数, 他的好处与坏处(坏处:要有多份, 不可以做虚函数, 其次的话想要打补丁的时候找不到地址,内联函数没有地址)
-
补丁原理, 说在不重新编译额情况下, 想要修改一个函数怎么办(就是将我们原来生成的符号的地址指向的那块内存中的第一条指令替换为跳转指令, 不是很懂)
-
反问
华为二面 1h
1.自我介绍
2、手撕代码:
生产者消费者模型 -因为之前在准备字节面试时准备过,所以很快就秒了
3、测试程序输入上的考虑(定义数组的时候开了n个容量, 有什么考量)
4、项目里面承担什么角色(讲了氛围好, 负责什么, 以及争议怎么解决)
5、项目是什么性质的项目(讲了每个项目的初衷, 主要是为了学习),问是保研还是考研
6、软件开发技能哪一块是比较熟悉的, 操作系统 7.定义了一个vector, 内存是如何管控的, 放在哪里(讲了动态内存, 后面被打断, 想问的是两个阶段的分配地址, 第一个是在连接过程中的重定位, 一个是加载到内存的物理地址)
8、申请了内存之后是怎们释放的(栈上的, 系统回收,如何回收的,不是很会,面试官认为在说java的回收, 又说了malloc的底层, 还提了一嘴buddy和slab算法)
9、各个段是bin文件, 如何装载到内存(讲了加载一个可执行文件的过程,中间被打断, 就是想问两个地址什么时候分配的,bin文件中的函数地址如何映射到内存中的地址)
10、软件技能哪些比较擅长的, 为什么要进行序列化和反序列化, 怎么能够减少开销,能不能避免掉