一面:
第一步自我介绍。
第二步,先问了我线程和进程的区别,这一块我没有系统学过,说了一点儿就告诉面试官我不怎么会;然后问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; }基础知识还是不过关,继续加油!
全部评论
(4) 回帖