美团正式批二面服务器开发工程师
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;
}
}; 