字节实习面试(3-23一面 3-28二面 3-30三面)
一面:
第一步自我介绍。
第二步,先问了我线程和进程的区别,这一块我没有系统学过,说了一点儿就告诉面试官我不怎么会;然后问TCP/IP如何实现可靠传输,balabala讲了一堆都没讲到点子上,因为我确实没背过这些东西。。。再问数据库,我也不会。
面试官只好让我谈谈我实验室做的项目,我是做机器人的,介绍了一堆他可能也没咋听懂,以上一共花了十几分钟吧。
第三步,做题。先问了一个给一组数有正有负,输出正负交替,多余的就全放在后面,让我先写,写完了再给他讲,他好像说是给二十分钟?我思路就是用一个标记flag表示当前需要正数还是负数,遍历数字,如果当前是需要的数字就flag=!flag然后continue,如果不是就往后找一个需要的数字跟它交换位置,然后flag=!flag。
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> a = {-1, 3, 2, 4, 5, -6, 7, -9};
bool flag = true;
for (int i = 0; i < a.size(); ++i){
if (flag && a[i]>=0){
flag = !flag;
continue;
}
if (!flag && a[i]<0){
flag = !flag;
continue;
}
if (flag){
int j = i + 1;
while (j < a.size() && a[j] < 0) ++j;
if (j == a.size()) break;
swap(a[i], a[j]);
}
else {
int j = i + 1;
while (j < a.size() && a[j] >= 0) ++j;
if (j == a.size()) break;
swap(a[i], a[j]);
}
flag = !flag;
}
for (auto& num : a) cout << num << " " ;
return 0;
} 又问了一个单链表,从k处断开成两条,然后前面那条放到后面那条的尾部去,k可能大于链表本身长度,需要循环回来,要求把找到k处的过程输出出来。
#include <iostream>
#include<vector>
using namespace std;
struct List
{
int val;
List* next;
List(int v) : val(v) , next(nullptr){}
};
int main() {
vector<int> a = {1, 2, 3, 4, 5, 6};
int k;
cin >> k;
List* head = new List(0);
List* p = head;
for (int i = 0; i < a.size(); ++i){
p->next = new List(a[i]);
p = p->next;
}
p = head;
while (k){
cout << p->next->val << " ";
if (p->next->next == nullptr) p = head;
else p = p->next;
--k;
}
List* ans = p->next;
List* q = ans;
while (q->next != nullptr) q = q->next;
q->next = head->next;
p->next = nullptr;
q = ans;
cout << endl;
while (q){
cout << q->val << " ";
q = q->next;
}
return 0;
} 第四步,你有什么问题想问我?我问咋学基础知识,答做项目。基础知识我是真背不下来啊,背书太难了!!!
二面:
没有自我介绍,直接聊实验室做的项目,然后说他觉得我这个体现不了互联网工程思维,对我是否适合做后端开发提出质疑,经历了漫长的解释面试官勉强接受吧。
聊一聊面向对象,我对多态的解释还可以,他表示满意。
给你一组数据,包含学号姓名以及各种信息,希望按学号有序存储,你用什么数据结构。
聊一聊链表和集合。
做题,接雨水,我说单调栈,面试官对我的思路表示不理解,“你凭什么会想到单调栈,这不符合正常解决问题的思维,你应该最直接的想法怎么可能是单调栈?”然后我只好说我见过这题,单调栈是比较优化的解法,并且好理解。“这个怎么会好理解,而且这个也不是最优解,最优解只需要一次遍历,空间复杂度O(1)。”经历了漫长的解释面试官认为我的做法可行,然后他给我介绍了双指针的做法。然后他说超时了,代码就不写了。
聊的太发散了,有些问题记不住了,总体来讲感觉他不像一个写业务代码的人,更像是一个架构?
没想到给我过了。
三面:
自我介绍,你擅长什么语言?我说C++,然后问了C++是如何实现泛型编程的,C++运行时内存分配,C++指针放在哪个区域。
段页式管理每一次数据访问要访问几次内存,如果有缓存呢?用什么缓存?有哪些缓存?(给我问懵了)
死锁发生条件和处理策略。
散列表哈希化方式有哪些?如何处理哈希冲突?(这个记不住了,C++一般不问这个,《大话数据结构》里面有但没记住)
TCP拥塞控制。
输入URL显示无法访问怎么办?(这个我更懵逼了)
你觉得你有什么知识点我还没问到?我说我对C++比较熟悉,就又问了一个new和malloc的区别。
做题,无序数组找中位数,我说我的思路是模拟快排,但是中位数如果数组元素数量是偶数需要运行两次这个过程,面试官说你就按照奇数个来写就行。
#include <iostream>
#include<vector>
using namespace std;
int work(vector<int>::iterator left, vector<int>::iterator right, int k){
if (left >= right) return -1;
int val = *left;
vector<int>::iterator x = left + 1;
vector<int>::iterator y = right - 1;
while ( x <= y ){
while (*x < val) ++x;
while (*y > val) --y;
if (x <= y){
swap(*x, *y);
++x;
--y;
}
}
swap(*left, *y);
int len = y - left + 1;
if (len == k) return *y;
if (len < k) return work(y+1, right, k-len);
return work(left, y, k);
}
int main() {
vector<int> num = {1, 2, 3, 4 ,5 ,6, 7};
int n = num.size();
int k = 1 + n / 2;
cout << work(num.begin(), num.end(), k) << endl;
return 0;
} 基础知识还是不过关,继续加油!