百度一、二、三面面经(C++后台开发,搜索架构部)

2,950 阅读5分钟

一二面都没怎么详细问我问我项目问题,但手撕代码比较多,加起来总共8道,这里根据回忆做一个汇总,忽略问题的具体顺序

一、二面

基础知识:

1.TCP四次挥手中time_wait作用是什么?去掉这个过程会有哪些后果?
2.虚函数的实现机制?
3.vector,queue的底层数据结构是什么?循环链表有什么好处?
4.详细讲讲平衡二叉树?和红黑树的具体差异?
5.知道哪些排序算法?给我详细讲讲快速排序和堆排序的实现原理和过程?
6.给我详细介绍下TCP特性?
7.你知道哪些mysql引擎?详细讲讲innodb和myisam区别?
8.为什么要使用联合索引?对(a,b,c)建立联合索引,where a=3,b>4,c=5能使用这个联合索引吗?为什么?
9.共享锁的特点?
10.什么是事物?详细介绍下ACID四个特性?
11.三大范式分别介绍下?
12.TCP三次握手过程,改成两次握手会有什么影响?
13.进程间通信有哪些方式?用过哪些?讲讲管道和消息队列一些特性?
14.数据库的四种隔离级别?分别解决了哪些不一致的问题?
15.浏览器从输入www.baidu.com到显示界面中间完整的过程?
16.什么是死锁?形成死锁的条件?怎么避免出现死锁?
17.除了select网络模型你你还知道哪些网络模型?讲讲select和epoll网络模型的区别?
18.讲讲进程的内存分布?讲讲栈和堆有哪些区别,越详细越好?

-----回忆起来了就补充上-----

算法题(都是在他给的网页上写,有几个代码我写完还保留着,每面四个,一面还有个没想起来):

1.给定字符串求最长回文子串(中心扩展法写完不满意,又要求写了动态规划的)
2.求链表的倒数第k个结点
3. 一个二维数组,从左到右依次递增,从上到下依次递增。给定一个数,判断该二维数组中是否有它?(好像是个leecode上的原题)
4.手写快速排序

void QuickSort(vector<int> nums){
  int size=nums.size();
  if(size<=1)
    return;
  QuickSortCore(nums,0,size-1);
}
void swap(int& a,int& b){
  int tmp=a;
  a=b;
  b=tmp;
}
void QuickSortCore(vector<int>& nums,int start,int end){
  if(end-start<=1)
    return;
  int i=start;
  int j=end;
  while(j>i){
    while(nums[j]>=nums[start] && j>i){
      --j;
    }
    while(nums[i]<=nums[start] && j>i){
      ++i;
    }
    if(j>i){
      swap(nums[i],num[j]);
    }
  }
  swap(nums[start],nums[i]);
  QuickSortCore(nums,start,i-1);
  QuickSortCore(nums,i+1,end);
}

5.给定一个数组,求连续数字的最大和(加起来的和最大的子数组)

int MaxContinueSum(vector<int> nums){
  int size=nums.size();
  if(size<1)
    return INT_MIN;
  if(size==1return nums[0];
  vector<int> max(size,0);
  max[0]=nums[0];
  int maxSum=nums[0]
  for(int i=1;i<size;++i){
    max[i]=max(nums[i],nums[i]+max[i-1]);
    if(max[i]>maxSum){
      maxSum=max[i];
  }
    return maxSum;
}

6.求二叉树中给定两个结点的最近公共父节点

Node* FindCloesestParent(Node* pRoot,Node* p1,Node* p2){
  if(pRoot==p1 || pRoot==p2){
    return nullptr;
  bool left=HasAimNode(pRoot->Pleft,p1,p2);
  bool right=HasAimNode(pRoot->Pleft,p1,p2);
  if(left&&right){
    return pRoot;
  if(!left && !right)
    return nullptr;
  if(left){
    FindCloesestParent(pRoot->pLeft,p1,p2);
  }else{
     FindCloesestParent(pRoot->pRight,p1,p2);
  }
}
bool HasAimNode(Node* pRoot,Node* p1,Node* p2){
  if(!pRoot){
    return false;
  if(pRoot==p1 || pRoot==p2){
    return true;
  }else{
    return HasAimNode(pRoot->pLeft,p1,p2) || HasAimNode(pRoot->pRight,p1,p2);
  }
}

7.一个数组中有两个数字出现了一次,其他都出现了两次,把这两个数找出来(异或大法多快好省)

总结

总体感觉是面试基础知识问的不是很细,大都叫我自己讲,主要看面试者了解的全不全深不深吧。算法题部分难度都不高,刷题量足够的问题不大,就是得注意下代码规范;

三面(经理面)

1.你大学期间最有成就的事是什么?你认为是自己的什么优势使你成功的?
2.你说你做了两个数据分析的项目,能简单介绍下吗?
3.你怎么看待程序员三十之后很容易被淘汰的说法?
4.你觉你在实际工作中最大的优势是什么?
5.你本科和研究生期间遇到的最大困难是什么?你怎么解决的?学到了什么?
6.你本科和研究生期间最失败的事情是什么,领悟到了什么?
7.除了C++之外,你技术栈还有哪些?
8.谈谈你的优点?
9.你怎么看到互联网行业经常加班的问题?
10.你硕士阶段在哪一块学习研究上上花的时间最多?
11.你说你大一成绩不错,后来成绩很一般,是什么原因造成的?
12.你未来五年内的规划是什么?
13.你遇到的最难的一门课是什么?你是怎么克服这个困难的?
14.你有参与过github上的一些开源项目或者看过一些源码吗?

三面的问题其实大都挺常见的,自己平时多注意思考总结一下就行,面试的时候可以临时组织语言自由发挥。

5.6接到OC!