1. 程式人生 > >奇虎360面試總結

奇虎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<int>& 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. 什麼是殭屍程序,什麼是孤兒程序

  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<int>& 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;
}