奇虎360面试总结

一共三面,2面介绍,1面hr。由于我在北京,投递岗位地点在上海,所以选的是视频面试,一天内面完。

一面

基础+两个算法题

算法题1:将排序二叉树拉直成有序的双向链表
之前做到过,直接上代码

struct TreeNode{
    int val;
    struct TreeNode* left;
    struct TreeNode* right;
};

TreeNode* treeToList(TreeNode* root){
    if(root == NULL){
        return NULL;
    }
    if(root->left == NULL && root->right == NULL){
        return root;
    }
    
    TreeNode* head = NULL;
    TreeNode* lHead = NULL;
    if(root->left != NULL){
        lHead = treeToList(root->left);
        head = lHead;
        while(lHead->right != NULL){
            lHead = lHead->right;
        }
        lHead->right = root;
        root->left = lHead;
    }
    else{
        head = root;
    }
    
    TreeNode* rHead = NULL;
    if(root->right != NULL){
        rHead = treeToList(root->right);
        root->right = rHead;
        rHead->left = root;
    }
    
    return head;
}

扩展:用非递归怎么做
想的是可以借助非递归前序遍历的思想,但是没写出来,面试结束后查了下资料,可以参考资料

算法题2:给出一支股票过去每个交易点的价格,写一个方法,求出最佳的买点和卖点,使得买卖一次收益最大化

int solution(vector& v){
    int n = v.size();
    int curMax = v[n-1];
    int result = 0;
    
    int buy = -1;
    int sell = -1;
    int temp = n-1;
    for(int i = n-2; i >= 0; --i){
        if(curMax - v[i] > result){
            result = curMax-v[i];
            buy = i;
            sell = temp;
        }
        if(curMax < v[i]){
            curMax = v[i];
            temp = i;
        }
    }
    
    if(buy == -1){
        cout << 0 << endl;
    }
    else{
        cout << buy << " " << sell << endl;
    }
    
    return 0;
}

二面

基础+三个算法题

基础
记录下没答好的问题:

  1. 拷贝构造函数的签名,返回值是什么
    http://www.cnblogs.com/helloWaston/p/4554058.html

  2. 三次握手需要协商什么东西
    序列号、窗口、还有啥?

  1. 什么是僵尸进程,什么是孤儿进程

  2. 父进程 wait()是干啥的,为啥需要这个
     某一子进程终止执行后,若其父进程未提前调用wait,则内核会持续保留子进程的退出状态等信息,以使父进程可以wait获取之。而因为在这种情况下,子进程虽已终止,但仍在消耗系统资源,所以其亦称僵尸进程。

  3. New和malloc区别,new返回bad_alloc是try catch捕获异常返回还是正常的返回
    异常

算法题1:2N+1个数,除了1个数,其他都是成对出现,找出这个数
算法题2:3N+1个数,除了1个数,其他都是出现三次,找出这个两个数
算法题3:2N+2个数,除了2个数,其他都是成对出现,找出这个两个数
三个题在leetcode上都出现过,这里只上一下第三题的代码:

int solution(vector& v){
    int n = v.size();
    int num = 0;
    for(int i = 0; i < n; ++i){
        num ^= v[i];
    }
    
    num &= (-num);  //关键地方
    
    int first = 0;
    int second = 0;
    for(int i = 0; i < n; ++i){
        if((v[i] & num) == 0){
            first ^= v[i];
        }
        else{
            second ^= v[i];
        }
    }
    
    cout << first << " " << second << endl;
    return 0;
}

你可能感兴趣的:(校招)