2019瓜子网后台开发笔试题目

填空题:
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);
    }
}

猜你喜欢

转载自blog.csdn.net/u014077947/article/details/79769766