腾讯c++开发一面面经
1.说一下快排的思路:
分为三步:
- 确定分界点(左端点,右端点,中间断点);
- 调整区间(小于选定数放左边,大于选定数放右边);
- 递归处理左右两个区间;
代码如下:
# include <iostream> # include <algorithm> using namespace std; const int N = 1e6 + 10; int n; int q[N]; void quick_sort(int q[], int l, int r) { if( l >= r) return; int mid = q[l + r >> 1], i = l - 1, j = r + 1; while(i < j) { do i++; while(q[i] < mid); do j--; while(q[j] > mid); if(i < j) swap(q[i], q[j]); } quick_sort(q, l, j); quick_sort(q, j + 1, r); } int main() { scanf("%d", &n); for(int i = 0; i < n; i++) scanf("%d", &q[i]); quick_sort(q, 0, n - 1); for(int i = 0; i < n; i++) printf("%d ", q[i]); return 0; }堆排序:用一维数组执行down()函数建堆,每次用末尾元素挤出堆顶元素
代码如下:
# include <iostream> # include <algorithm> using namespace std; const int N = 1e5 + 10; int n, m; int h[N], sizen; void down(int u) { int t = u; if( 2 * u <= sizen && h[2* u] < h[t]) t = 2 * u; if(2 * u + 1 <= sizen && h[2 * u + 1] < h[t]) t = 2 * u + 1; if(u != t) { swap(h[t], h[u]); down(t); } } int main() { scanf("%d%d", &n, &m); for(int i = 1; i <= n; i++) scanf("%d", &h[i]); sizen = n; for(int i = sizen / 2; i > 0; i--) down(i); while(m--) { printf("%d ", h[1]); h[1] = h[sizen--]; down(1); } return 0; }2.bfs的递归实现算法
3.动态链接库的原理
4.c++编译运行的过程,python编译过程,为什么是解释性语言
5.讲一讲进程池和线程池,如何实现服务器的多线程
6.tcp和udp的区别
7.tcp是百分百可靠的吗,如何实现udp的可靠传输
#面经##腾讯##C++工程师#