填空题:
1、有三道概率题,感觉后台开发的很喜欢考概率题呀
2、树的前序遍历、后序遍历、中序遍历
3、两道网络题目,求掩码和确认序号的
4、数据库ACID的意义是什么: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
5、二叉树的叶子节点怎么计算的
6、图的邻接矩阵最少的非空元素有多少:n个顶点的连通图,至少有n-1条边,它的邻接矩阵中至少有n-1个非零元素
7、有序数组合并的最小最大次数是多少: n-1 和2n-1
8、sizeof的求解
9、fork和print 一起求输出字符的个数 :print 带\n 的话,则会清除缓存,不带的话,则子进程中会含有原来的输出字符
编程题:
1、二叉树的合并
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
}BiTNode,*BiTree;
struct TreeNode* merge(struct TreeNode* l, struct TreeNode* r) {
if (l && r) {
l->val += r->val;
l->left = merge(l->left, r->left);
l->right = merge(l->right, r->right);
return l;
}
else {
return l ? l : r;
}
}
struct TreeNode* mergeTrees(struct TreeNode* t1, struct TreeNode* t2) {
struct TreeNode* ret = t1;
merge(t1, t2);
return ret;
}
2、快速查找数组中的第 K 小的数字
方法一:可以全部排序,然后找到第k 个数,用STL自带的sort,或者直接写排序算法进行排序
方法二:类似于二分法,不断缩小排序的规模,知道第 K 个最小的数字,参见July的 编程之法
下面的这种快速选择排序始终只对一边的数组进行递归排序,最坏也就是O(n),
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
//right 是数组的最后一个元素 等于 n-1
int median3(int a[], int left, int right)
//下面的快速排序算法实现之一,及通过三数取中分割法寻找最小的k个数的快速选择SELECT算法都要调用这个median3函数
{
int center;
center = (left + right) / 2;
if (a[left] > a[center])
swap(a[left], a[center]);
if (a[left] > a[right])
swap(a[left], a[right]);
if (a[center] > a[right])
swap(a[center], a[right]);
/* invariant: a[left] <= a[center] <= a[right] */
swap(a[center], a[right - 1]); /* hide pivot ,pivot 放在了倒数第二个元素*/
return a[right - 1]; /* return pivot */
}
void insert_sort(int array[], int left, int loop_times)
{
for (int j = left; j < left + loop_times; j++)
{
int key = array[j];
int i = j - 1;
while (i>left && array[i]>key)
{
array[i + 1] = array[i];
i--;
}
array[i + 1] = key;
}
}
void quick_sort(int s[], int k, int left, int right)
{
int i, j;
int pivot;
if (left < right)
{
pivot = median3(s, left, right);
cout <<" "<< pivot << endl;
for (int ii = 0; ii < 20; ++ii)
cout << " " << s[ii];
cout<< endl;
i = left;
j = right - 1;
for (;;)
{
while (s[++i] < pivot) {}
while (s[--j] > pivot){}
if (i < j)
{
swap(s[i], s[j]);
}
else
{
break;
}
}
swap(s[i], s[right - 1]); //交换相应的主元,把s[i] 放到了倒数第二个元素位置
cout << "i " << i << " j " << j << endl;
if (k <= i)
{
quick_sort(s, k, left, i - 1);
}
else
if (k > i + 1)
{
quick_sort(s, k, i + 1, right);
}
}
else
{
insert_sort(s,left, right - left + 1);
}
}