百度凤巢面试复盘(策略研发方向)
一面(51min)
-
自我介绍+问项目
-
写正则表达式:抓取以a开头b结尾的字符串在哪一行
-
算法:逆置链表(注意命名规范)
-
解释内存中的堆栈:是确切存在的物理结构,是用来存放不同数据的内存空间。堆实际是一个队列,与操作系统内存分配(首次适应等算法契合),用户动态分配释放堆。栈:实际上也是FILO的结构,如递归、函数调用用到,用于保存变量值(保护现场),操作系统自动分配释放栈。
例题:
int a=6; int *p= new int(); // p、a分别在栈还是堆
-
解释C++静态变量,eg:static int a
两种变量存储在静态存储区:全局变量和static变量
作用1:隐藏,同样一个变量名在file1.cpp定义,在file2.cpp也可以定义不会冲突。
作用2:保持变量持久,具有记忆功能和全局生命期。
作用3:默认初始化为0。
作用4:C++中的类成员声明static
在类中声明static变量或者函数时,初始化时使用作用域运算符来标明它所属类,因此,静态数据成员是类的成员,而不是对象的成员。
(参考:https://www.cnblogs.com/songdanzju/p/7422380.html)
-
进程之间的通信方式:套接字、共享内存、管道、锁等;
-
网络中进程的唯一标识是什么?简述A进程怎么和B进程通信。
-
有以下题目:
struct A { int a; char b; }; // 求sizeof(A)=?
考虑内存对齐,答案为8。
(参考:https://blog.csdn.net/xiong452980729/article/details/70140050)
9. 简述算法:求两个无序数组的交集。(快问快打环节、面试官没给太多思考时间)
–A:用set/multiset
–Q:时间复杂度多少?
–A:底层是红黑树实现,总体时间复杂度O(nlogn)。
–Q:不用容器呢?有没有更快的方法?可以有空间开销。
–A:利用hash,记录哪些元素被访问过。时间复杂度是O(n),但是有额外空间开销。
–Q:如果数组有序呢?不能有空间开销。
–A:(有序必用二分查找啊),用二分查找,将第二个数组的重复元素置为一个不会用到的数。时间复杂度O(nlogn)。
二面(54min)
-
自我介绍+问项目
-
C语言考察,指针考察。
main() { char *str; input(str); cout<<str<<endl; } // 要求完成input()函数,实现输入什么输出就是什么,保证输入只有数字和字母。 补全: void input(char *&); int main() { char* str; str = NULL; input(str); cout << str << endl; return 0; } void input(char* &str) // 注意这里要用指针的引用,因为指针的指向发生改变,实质是值传递。 { str = new char[101]; // 注意开辟空间 scanf("%s", str); // 注意str前没有& }
-
内存中的堆栈区别。(同一面)
-
什么是虚函数。
-
算法:实现一个IP地址映射到一个INT,并且INT也能映射会IP地址,不能有额外开销。
– 由于IPV4是32位,INT也是32位,按位存储即可。
实现IP地址映射到INT的算法。(字符串处理+位运算)
-
一个链表奇数偶数夹杂乱序,如何使奇数在前,偶数在后。
– 创建两个头指针head1、head2,遍历链表,奇数插入head1,偶数插入head2,最后修改head1链尾指针即可。
-
算法:实现二叉排序树。(15min以内实现)
struct Node { int val; Node *left; Node *right; }; Node* BuildBST(const vector<int>&nums) {} // 顺序插入nums中的元素
-
两个链表,
1->3->3 表示133这个数
1->3 表示13这个数
这两个链表相加
1->4->6
如何实现?
– 考虑特殊情况 9->9->9 , 1 这两个链表相加得 1->0->0->0 ,最好的方法是链表逆置只有,个位对齐,进位向后传递。
三面(10min)
- 自我介绍,主要是互相了解情况,说明一些实习原则,然后对你个人进行了解。
- 你还有什么问题问我吗?
感受:第一场企业面试,很受用,也很激动,很多话没有说好,也发现自己有很多没有理解的地方。此次面试难度中等,没有压力面。