美团正式批二面服务器开发工程师
1.项目中如何实现IO多路复用的,能讲讲吗?
2.那select、poll、epoll又是如何实现一个主进程监听多个客户端呢?(底层实现)
3.能说说同步阻塞、同步非阻塞、异步阻塞、异步非阻塞吗?(同步,异步与阻塞,非阻塞并没有关系)
4.说说你是如何用小根堆实现的定时器,以及你为什么要用小根堆?(可以实现较为精确定时)
5.进程和线程的区别?
6.进程的上下文切换相比于线程具体多了哪些开销呢?
7.线程同步机制有哪些?(互斥锁、自旋锁、条件锁、读写锁)
8.说说上述各个线程同步之前的区别?
9.有了互斥锁,为什么还要条件锁?(条件锁反复尝试上锁,但无需进行内核切换)
手撕代码
求有n个元素的序列前k个最小的数。
(没调出来,难受)
快排实现:
class Solution { public: vector<int> res; vector<int> quicksort(vector<int>& q, int l, int r, int k) { if (l >= r) { for (int i = 0; i <= l; ++i) res.push_back(q[i]); return res; } int i = l - 1, j = r + 1; int x = q[l + r >> 1]; while (i < j) { do i++; while (q[i] < x); do j--; while (q[j] > x); if (i < j) { swap(q[i], q[j]); } } int sl = j - l + 1; if (sl >= k) return quicksort(q, l, j, k); // Left else return quicksort(q, j + 1, r, k - sl); // Right } vector<int> getLeastNumbers(vector<int>& q, int k) { if (k == 0) return {}; int n = q.size(); return quicksort(q, 0, n - 1, k); } };
class Solution { public: vector<int> getLeastNumbers(vector<int>& arr, int k) { priority_queue<int> q; // 默认是大根堆 for (auto& x : arr) { q.push(x); if (q.size() > k) q.pop(); } vector<int> res; while (q.size()) { res.push_back(q.top()); q.pop(); } return res; } };