2014網易實習生招聘面試題

http://blog.csdn.net/silangquan/article/details/18969875

不拼搏,枉少年

網易遊戲2014年實習生招聘。

過程:無電面,筆試半小時,兩道算法題,面試一小時。

結果:7進2,撲街。

這是我最接近網易遊戲的一次。

下面大部分的內容是沒有答上來的。

1.算法題:Write a method to replace all spaces in a string with ‘%20’.

2.算法題:Implement a function to check if a tree is balaned. For the purpose of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by more than one.

3.Linux權限有哪幾種?什麼是文件夾的執行權限?

4.什麼叫做守護進程?

5.git中 branch命令的用法。

6.如何修改git中一個commit的註釋?

7.C中static函數有什麼作用?

8.如何擴展紅黑樹,能夠得到樹中某個節點的秩。

9.X是整數,X>=5,X與X+2都是素數,請證明:X+1一定是6的倍數.

筆試題

1.字符串替換

Write a method to replace all spaces in a string with ‘%20’.

Cracking the Coding Interview 原題

[cpp] view plaincopy

  1. /* 
  2. 思路: 
  3. 0.使用每個空格表示一個字符。 
  4. 1.遍歷字符串,求出空格數目。 
  5. 2.計算當前字符串總長度,包括'\0'。 
  6. 3.計算替換後需要的長度(增加空間:空格數*2)。 
  7. 4.創建兩個指針分別指向當前字符串末尾和替換後的字符串的末尾。 
  8. 5.由後向前複製字符串內容,直到第一個指針遇到空格爲止。 
  9. 6.把空格替換成'%20',並第一個指針前移1格,第二個指針前移3格。 
  10. 7.重複步驟5和6。 
  11. */
  12. #include <iostream>  
  13. using namespace std;    
  14. //length表示字符數組line[]的總容量,而非表示數組實際長度,可以自己給定.  
  15. int replaceBlank(char line[],int length)    
  16. {    
  17. //line = new char[length];  
  18. int flag = 0;    
  19. //字符數組line爲空字符數組.  
  20. if(line == NULL || length <= 0)    
  21.     {    
  22.         flag = -1;    
  23. return flag;    
  24.     }    
  25. //odlLength表示替換前字符串實際長度.  
  26. int odlLength = 0;    
  27. int blankNumber = 0;    
  28. int i = 0;    
  29. //計算字符串總長度和其存在空格數.  
  30. while (line[i] != '\0')    
  31.     {    
  32.         ++odlLength;    
  33. if(line[i] == ' ')    
  34.             ++blankNumber;    
  35.         ++i;    
  36.     }    
  37. //末尾'\0'也佔用一個空格.  
  38.     odlLength += 1;    
  39. //若不存在空格,直接結束程序.  
  40. if(blankNumber == 0)    
  41.     {    
  42.         flag = 1;    
  43. return flag;    
  44.     }    
  45. //newLength表示替換後的字符串實際長度.  
  46. int newLength = odlLength + blankNumber * 2;    
  47. //替換後的字符串長度大於原字符數組總容量.  
  48. if (newLength > length)    
  49.     {    
  50.         flag = 2;    
  51. return flag;    
  52.     }    
  53. //定義數組下標.  
  54. int p = odlLength - 1;    
  55. int q = newLength - 1;//cout << "p: " << p << ", q: " << q;  
  56. while (p >= 0 && q > p)    
  57.     {    
  58. //不管是字符還是'\0'均替換.  
  59. if(line[p] != ' ')    
  60.         {    
  61.             line[q] = line[p];////////////////////////////////////////////////////////////  
  62.             --q;    
  63.             --p;    
  64.         }    
  65. //若爲空格  
  66. else
  67.         {    
  68. //第二個指針前移3格  
  69.             line[q--] = '0';    
  70.             line[q--] = '2';    
  71.             line[q--] = '%';    
  72. //第一個指針前移1格  
  73.             --p;    
  74.         }    
  75.     }    
  76. return flag;    
  77. }    

2.判斷一棵樹是否是平衡樹。

Implement a function to check if a tree is balaned. For the purpose of this question, a balanced tree is defined to be a tree such that no two leaf nodes differ in distance from the root by more than one.

Cracking the Coding Interview 原題

注:書上的解答直接以 二叉樹爲準,但題目中沒有說是二叉樹,但平衡就默認指二叉樹。

結構體定義:

[cpp] view plaincopy

  1. struct node   
  2. {  
  3. int data;  
  4. struct node * lchild;  
  5. struct node * rchild;  
  6. };  

下面正確地示範以下錯誤的解法.

思路:

分別求最大深度和最小深度,得到的結果相減,然後判斷。

[cpp] view plaincopy

  1. int maxDepth(struct node *root)  
  2. {  
  3. if (root == NULL)   
  4.   {  
  5. return 0;  
  6.   }  
  7. else
  8.   {  
  9. return 1 + max(maxDepth(root->lchild), maxDepth(root->rchild));  
  10.   }  
  11. }  
  12. int  minDepth(struct node *root)  
  13. {  
  14. if (root == NULL)   
  15.   {  
  16. return 0;  
  17.   }  
  18. else
  19.   {  
  20. return 1 + min(minDepth(root->lchild), minDepth(root->rchild));  
  21.   }  
  22. }  
  23. // 分別求出樹的最大深度和最小深度,然後判斷它們的差是不是大於1
  24. // 該算法遍歷了二叉樹兩遍
  25. bool isBalanced1(struct node *root)  
  26. {  
  27. return (maxDepth(root) - minDepth(root) >= 1);  
  28. }  

尼瑪!哪來的最小深度。除非上面的節點全是滿的。只能求二叉樹的最大深度好麼。

未優化的正確解法

[cpp] view plaincopy

  1. int maxDepth(TreeNode *root){  
  2. if(NULL == root){  
  3. return 0;  
  4.     }  
  5. int maxL = maxDepth(root->left);  
  6. int maxR = maxDepth(root->right);  
  7. return 1 + (maxL > maxR ? maxL : maxR);  
  8. }  
  9. bool isBalanced(TreeNode *root) {  
  10. // Start typing your C/C++ solution below
  11. // DO NOT write int main() function
  12. if(NULL == root){  
  13. return true;  
  14.     }  
  15. int diff = maxDepth(root->left) - maxDepth(root->right);  
  16. if((diff>1) || (diff<-1)){  
  17. return false;  
  18.     }  
  19. return isBalanced(root->left) && isBalanced(root->right);  
  20.  }  

優化後的解法,加了一點DP

使用後序遍歷二叉樹的節點,遍歷時記錄節點深度,同時也可以更快的判斷出二叉樹不平衡的情況。

[cpp] view plaincopy

  1. bool isBalanced(TreeNode *root, int *depth){  
  2. if(NULL == root){  
  3.          *depth = 0;  
  4. return true;  
  5.      }  
  6. int left, right;  
  7. if(isBalanced(root->left, &left) && isBalanced(root->right, &right)){  
  8. int diff = left - right;  
  9. if((diff>1) || (diff<-1)){  
  10. return false;  
  11.        }  
  12.         *depth = 1 + (left > right ? left : right);  
  13. return true;  
  14.     }  
  15. }   
  16. bool isBalanced(TreeNode *root) {  
  17. // Start typing your C/C++ solution below
  18. // DO NOT write int main() function
  19. int depth = 0;  
  20. return isBalanced(root, &depth);  
  21. }  

面試問題

Linux相關

3.Linux權限有哪幾種?什麼是文件夾的執行權限?

用ls-l命令來查看文件權限

第一個字符表示文件類型,第2~10個字符當中的每3個爲一組,左邊三個字符表示所有者權限,中間3個字符表示與所有者同一組的用戶的權限,右邊3個字符是其他用戶的權限。這三個一組共9個字符,代表的意義如下: r(Read,讀取):對文件而言,具有讀取文件內容的權限;對目錄來說,具有瀏覽目 錄的權限。 w(Write,寫入):對文件而言,具有新增、修改文件內容的權限;對目錄來說,具有刪除、移動目錄內文件的權限。 x(eXecute,執行):對文件而言,具有執行文件的權限;對目錄了來說該用戶具有進入目錄的權限。

4.什麼叫做守護進程?

Linux Daemon(守護進程)是運行在後臺的一種特殊進程。它獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。它不需要用戶輸入就能運行而且提供某種服務,不是對整個系統就是對某個用戶程序提供服務。Linux系統的大多數服務器就是通過守護進程實現的。常見的守護進程包括系統日誌進程syslogd、 web服務器httpd、郵件服務器sendmail和數據庫服務器mysqld等。 守護進程一般在系統啓動時開始運行,除非強行終止,否則直到系統關機都保持運行。守護進程經常以超級用戶(root)權限運行,因爲它們要使用特殊的端口(1-1024)或訪問某些特殊的資源。 一個守護進程的父進程是init進程,因爲它真正的父進程在fork出子進程後就先於子進程exit退出了,所以它是一個由init繼承的孤兒進程。守護進程是非交互式程序,沒有控制終端,所以任何輸出,無論是向標準輸出設備stdout還是標準出錯設備stderr的輸出都需要特殊處理。 守護進程的名稱通常以d結尾,比如sshd、xinetd、crond等。

5.git中 branch命令的用法。

如果不加任何參數,它會給出當前所有分支的清單,加*號的表示當前分支。

git branch -v 查看各個分支最後一個提交對象的信息;

git branch --merged 查看哪些分支已被併入當前分支;

git branch --no-merged 查看尚未合併的工作;

git branch -d 強制刪除該分支上的改動;

6.如何修改git中一個commit的註釋?

對於修改最後一次修改,

git commit --amend 然後在出來的編輯界面,直接編輯 註釋的信息。

對於不是最後一次修改的情況,就必須使用rebase了。 git rebase -i HEAD~3 表示要修改當前版本的倒數第三次狀態。 這個命令出來之後,會出來三行東東: pick:******* pick:******* pick:******* 如果你要修改哪個,就把那行的pick改成edit,然後退出。 這時通過git log你可以發現,git的最後一次提交已經變成你選的那個了,這時再使用: git commit --amend 來對commit進行修改。 修改完了之後,執行 git rebase --continue

保存修改。

C/C++

7.C中static函數有什麼作用?

在函數的返回類型前加上關鍵字static,函數就被定義成爲靜態函數。 函數的定義和聲明默認情況下是extern的,但靜態函數只是在聲明他的文件當中可見,不能被其他文件所用。 定義靜態函數的好處: <1> 其他文件中可以定義相同名字的函數,不會發生衝突 <2> 靜態函數不能被其他文件所用。 存儲說明符auto,register,extern,static,對應兩種存儲期:自動存儲期和靜態存儲期。 auto和register對應自動存儲期。具有自動存儲期的變量在進入聲明該變量的程序塊時被建立,它在該程序塊活動時存在,退出該程序塊時撤銷。 關鍵字extern和static用來說明具有靜態存儲期的變量和函數。用static聲明的局部變量具有靜態存儲持續期(static storage duration),或靜態範圍(static extent)。雖然他的值在函數調用之間保持有效,但是其名字的可視性仍限制在其局部域內。靜態局部對象在程序執行到該對象的聲明處時被首次初始化。

8.如何擴展紅黑樹,能夠得到樹中某個節點的秩。

參考:劍指XX遊戲(六) - 輕鬆搞定面試中的紅黑樹問題

證明題

9.X是整數,X>=5,X與X+2都是素數,請證明:X+1一定是6的倍數。

真是一道超簡單的題,但當時就是沒有想出來。

解:X,X+1,X+2,爲三個連續數,那麼,X,X+1,X+2,三個數中一定有個數是3的整數倍。而X,X+2都是素數,那麼,X+1肯定是3的整數倍。 又,X是素數,且X>5,則X肯定是奇數。X+1肯定爲偶數,所以X+1是2的倍數。 故,X+1是2的倍數,且是3的倍數。由此可證明,X+1是6的倍數。

總結

1.算法是重中之重!Cracking the coding interview, leetcode 刷起;

2.把握好節奏。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章