奇虎360面試總結
阿新 • • 發佈:2018-12-14
一共三面,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; }
二面
基礎+三個演算法題
基礎 記錄下沒答好的問題:
-
什麼是殭屍程序,什麼是孤兒程序
-
父程序 wait()是幹啥的,為啥需要這個 某一子程序終止執行後,若其父程序未提前呼叫wait,則核心會持續保留子程序的退出狀態等資訊,以使父程序可以wait獲取之。而因為在這種情況下,子程序雖已終止,但仍在消耗系統資源,所以其亦稱殭屍程序。
-
New和malloc區別,new返回bad_alloc是try catch捕獲異常返回還是正常的返回 異常
演算法題1:2N+1個數,除了1個數,其他都是成對出現,找出這個數 演算法題2:3N+1個數,除了1個數,其他都是出現三次,找出這個兩個數 演算法題3
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;
}