牛客網算法工程師能力評估

 

牛客網算法工程師能力評估

題目來源:https://www.nowcoder.com/test/200/summary算法

一、遞歸算法x(x(8))須要調用幾回函數x(int n)?

class program
 {
     static void Main(string[] args)
     {
         int i;
         i = x(x(8));
     }
     static int x(int n)
     {
         if (n <= 3)
             return 1;
         else
             return x(n - 2) + x(n - 4) + 1;
     }
 }

 

A、9    B、12  C、18  D、24

選C。根據題意,易得x(3) = x(2) = x(1) = x(0) = 1數組

            x(8) = x(6) +x(4) +1
                 = x(4) + x(2) +1 + x(2) + x(0) +1 + 1  
               = x(2) + x(0) +1 + 1 + 1 +1 + 1 +1 + 1  
               = 9  
    x(8)  這個就調用了9次函數x(int n),同理可得x(9)也是調用了9次,函數x(int n)因此總共18次。

二、下列關於數的寬度優先搜索算法描述錯誤的是?

A、從根節點開始,沿着樹的寬度遍歷樹的節點。若是全部節點均被訪問,則算法停止

B、常採用先進後出的棧來實現算法函數

C、空間的複雜度爲O(V+E),由於全部節點都必須被儲存,其中V是節點的數量,E是邊的數量spa

D、時間複雜度爲O(V+E),由於必須尋找全部到可能節點的全部路徑,其中V是節點的數量,E是邊的數量指針

選B。爲了讓先搜索結點的鄰結點也先搜索,只能使用先進先出的隊列的思想。寬度優先搜索算法經常使用於圖。code

三、在有序表(12,24,36,48,60,72,84)中二分查找關鍵字72時所需進行的關鍵字比較次數是多少?

A、1  B、2  C、3  D、4
選B。正確的二分查找應該是一次折半後,high=middle-1 或者 low=middle+1;因此第一次查找時 high=6,low=0; middle= 0+6/2 = 3,即48;第二次查找時 high=6, low =3+1; middle = 4+(6-4)/2 =  5,即72,查出所找關鍵字,故答案爲B、2次

四、下面關於B-和B+樹的敘述中,不正確的是

A、B-樹和B+樹都是平衡的多叉樹
B、B-樹和B+樹均可用於文件的索引結構
C、B-樹和B+樹都能有效地支持順序檢索
D、B-樹和B+樹都能有效地支持隨機檢索
選C。B樹的定義是這樣的,一棵m階的B樹知足下列條件:(1)每一個結點至多有m棵子樹;(2)除根結點外,其餘每一個非葉子結點至少有m/2棵子樹;(3)若根結點不是葉子結點,則至少有兩棵子樹;(4)全部葉結點在同一層上。B樹的葉結點能夠當作一種外部結點,不包含任何信息;(5)全部的非葉子結點中包含的信息數據爲:(n,p0,k1,p1,k2,P2,…,kj-1,Pj-1)其中,ki爲關鍵字,且知足kiki+1;pi爲指向子樹根結點的指針,而且Pi-1所指的子樹中的全部結點的關鍵字均小於ki,Pj-1所指的子樹中的全部結點的關鍵字均大於kj-1。B+樹是應文件系統所需而出現的一種B樹的變型樹,其主要區別是一棵非葉子結點有n個子樹就有n個關鍵字,這些關鍵字的做用是索引;全部的葉子結點包含了所有關鍵字的信息,以及指向這些關鍵字記錄的指針,且葉子結點自己的關鍵字的大小自小而大順序連接。從上述的特色中咱們知道,這兩種樹都是平衡的多分樹,它們均可以用於文件的索引結構,但B樹只能支持隨機檢索,而B+樹是有序的樹,既能支持隨機檢索,又能支持順序檢索。

五、具備3個結點的二叉樹有幾種形態?

A、4
B、5
C、6
D、7

六、已知一棵二叉樹前序遍歷和中序遍歷分別爲ABDEGCFH和DBGEACHF,則該二叉樹的後序遍歷爲多少?

A、DGEBFHAC
B、DGEBHFCA
C、DEGHBFCA
D、DEGBHACF
選B。前序遍歷肯定根節點,中序遍歷肯定左右子樹。
A,    (BDEG,CFH)    
       (B,(D,EG));(C,( ,FH))
               (E,(G ,));       (F,(H,))      

七、已知數據表A中每一個元素距其最終位置不遠,爲節省時間排序,應採用什麼方法排序?

A、堆排序
B、插入排序
C、快速排序
D、直接選擇排序
選B。插入排序:若是平均每一個元素離最終位置相距c個元素,則其複雜度爲O(cn),一共n趟,每次比較c次;
    快速排序:最好的、平均的複雜度都是O(nlog(n)),若是每次選擇的中間數都最小或最大,那就是最壞的狀況,複雜度是O(n*n);因此快速排序和元素的位置沒有關係,跟選擇的中間數有關。
    堆排序:複雜度一直是O(nlog(n));
    直接選擇排序:跟元素位置沒有關係,都要遍歷n遍,每遍找出最小或最大數來,複雜度是O(n*n);

八、將N條長度均爲M的有序鏈表進行合併,合併之後的鏈表也保持有序,時間複雜度爲()?

A、O(N * M*logN)
B、O(N*M)
C、O(M)
D、以上都不正確
選A。一、兩兩合併鏈表。合併鏈表複雜度 * 一次合併次數 *   全部合併次數。兩兩合併的複雜度會指數遞增,合併數會指數遞減。一共應該是log(N)次。前面的合併複雜度較高。因此通常不採用該方法來合併鏈表。二、利用堆來合併,( O(N) + O(log N * N )) * M。先利用最鏈表第一個數,N個數創建堆,複雜度 O (N), 重構堆,並排序,複雜度 O(logN * N ), 每一個鏈表M個數,上述兩步重複M次。結果爲M * (O(N) + O(logN * N))= O (M * N * logN)

九、有2n我的排隊進電影院,票價是50美分。在這2n我的當中,其中n我的只有50美分,另外n我的有1美圓(紙票子)。愚蠢的電影院開始賣票時1分錢也沒有。 問: 有多少種排隊方法 使得 每當一個擁有1美圓買票時,電影院都有50美分找錢 ?

注:  1美圓=100美分 擁有1美圓的人,擁有的是紙幣,無法破成2個50美分
A、(2n)!/[n!n!]
B、(2n)!/[n!(n+1)!]
C、(2n)!/[n!(n-1)!]
D、(2n + 1)!/[n!(n-1)!]
選B。卡特蘭數

十、T(n) = 25T(n/5)+n^2的時間複雜度?

A、O(n^2*(lgn))
B、O(n^2)
C、O(lgn)
D、O(n*n*n)
選A。T(n) = 25*T(n/5) + n^2= 25*(  25*T(n/25) + (n/5)2 ) +    n^= 5^4*T(n/52) + 2*n^= 5^(2k)*T(n/5k) + k*n^根據主方法,有T(n) = aT(n/b)+O(n^d), 則a=5^(2k), b=5k, d=2, a=b^d。因此T(n)=O(n^d*(lgn))=O(n^2(lgn))。

十一、連續整數之和爲1000的共有幾組?

A、3
B、4
C、5
D、8
選B。設從n加到m和爲1000,則(n+m)(m-n+1)/2=1000,即(n+m)(m-n+1)=2000,即把2000分解成兩個數的乘積,且這兩個數爲一奇一偶。2000=(2^4)*(5^3),因而奇數可能爲5^0,5^1,5^2,5^3,即有四組解。

十二、一個有序數列,序列中的每個值都可以被2或者3或者5所整除,1是這個序列的第一個元素。求第1500個值是多少?

A、2040
B、2042
C、2045
D、2050
選C。二、三、5的最小公倍數是30。[ 1, 30]內符合條件的數有22個。若是能看出[ 31,  60]內也有22個符合條件的數,那問題就容易解決了。也就是說,這些數具備週期性,且週期爲30。第1500個數是:1500/22=68   1500%68=4。也就是說:第1500個數至關於通過了68個週期,而後再取下一個週期內的第4個數。一個週期內的前4個數:2,3,4,5。
故,結果爲68*30=2040+5=2045

1三、寫出a*(b-c*d)+e-f/g*(h+i*j-k)的逆波蘭表達式。

A、a(b-c*d)*+e-(f/g(h+i*j-k)*)
B、a(b-(cd*))*+e-(fg/(h+ij*-k)*)
C、a(bcd*-)*+e-(fg/hij*+k-*)
D、abcd*-*e+fg/hij*+k-*-
選D。表達式通常由操做數、運算符組成,例如算術表達式中,一般把運算符放在兩個操做數的中間,這稱爲中綴表達式,如A+B。波蘭數學家Jan  Lukasiewicz提出了另外一種數學表示法,它有兩種表示形式:把運算符寫在操做數以前,稱爲波蘭表達式或前綴表達式,如+AB;把運算符寫在操做數以後,稱爲逆波蘭表達式或後綴表達式,如AB+;
 將中綴表達式轉換成後綴表達式算法: 
一、從左至右掃描中綴表達式。 
二、若讀取的是操做數,則判斷該操做數的類型,並將該操做數存入操做數堆棧 
三、若讀取的是運算符 
  (1) 該運算符爲左括號"(",則直接存入運算符堆棧。 
  (2) 該運算符爲右括號")",則輸出運算符堆棧中的運算符到操做數堆棧,直到遇到左括號爲止。 
  (3) 該運算符爲非括號運算符: 
      (a) 若運算符堆棧棧頂的運算符爲括號,則直接存入運算符堆棧。 
      (b) 若比運算符堆棧棧頂的運算符優先級高或相等,則直接存入運算符堆棧。 
      (c) 若比運算符堆棧棧頂的運算符優先級低,則輸出棧頂運算符到操做數堆棧,並將當前運算符壓入運算符堆棧。 
四、當表達式讀取完成後運算符堆棧中尚有運算符時,則依序取出運算符到操做數堆棧,直到運算符堆棧爲空。 
  逆波蘭表達式求值算法:  
一、循環掃描語法單元的項目。  
二、若是掃描的項目是操做數,則將其壓入操做數堆棧,並掃描下一個項目。  
三、若是掃描的項目是一個二元運算符,則對棧的頂上兩個操做數執行該運算。  
四、若是掃描的項目是一個一元運算符,則對棧的最頂上操做數執行該運算。  
五、將運算結果從新壓入堆棧。  
六、重複步驟2-5,堆棧中即爲結果值。  
故選D

1四、下列關於線性表,二叉平衡樹,哈希表存儲數據的優劣描述錯誤的是?

A、哈希表是一個在時間和空間上作出權衡的經典例子。若是沒有內存限制,那麼能夠直接將鍵做爲數組的索引。那麼全部的查找時間複雜度爲O(1);
B、線性表實現相對比較簡單
C、平衡二叉樹的各項操做的時間複雜度爲O(logn)
D、平衡二叉樹的插入節點比較快
選D。哈希表是一個在時間和空間上作出權衡的經典例子。若是沒有內存限制,那麼能夠直接將鍵做爲數組的索引。那麼全部的查找時間複雜度爲O(1);若是沒有時間限制,那麼咱們可使用無序數組並進行順序查找,這樣只須要不多的內存。在平衡二叉樹中插入結點要隨時保證插入後整棵二叉樹是平衡的,因此可能須要經過一次或屢次樹旋轉來從新平衡這個樹。

1五、下面程序的功能是輸出數組的全排列。請填空。

void perm(int list[], int k, int m)
{
    if (    )
    {
        copy(list,list+m,ostream_iterator<int>(cout," "));
        cout<<endl;
        return;
    }
    for (int i=k; i<=m; i++)
    {
        swap(&list[k],&list[i]);
        (    );
        swap(&list[k],&list[i]);
    }
}
A、k!=m 和 perm(list,k+1,m)
B、k==m 和 perm(list,k+1,m)
C、k!=m 和 perm(list,k,m)
D、k==m 和 perm(list,k,m)
選B。k==m and perm(list,k+1,m);for循環的做用是爲先把index值爲k的元素後面的元素一次與index爲k的元素交換,至關於獲得index爲k的元素可能的取值狀況,而後使用遞歸獲得index爲k+1的元素位置可能的全部取值。然而對index爲k的位置元素進行取值的時候,操做事後須要還原避免取下一個值的時候錯誤,所以就有了第二個swap操做。由上分析可知,第一個空格應該爲k==m,當index值到了m的時候輸出便可,由於index爲m後面已經沒有元素與其進行對調。

1八、若以{4,5,6,7,8}做爲葉子結點的權值構造哈夫曼樹,則其帶權路徑長度是()。

A、24blog

B、30
C、53
D、69
選D。

19 用某種排序方法對關鍵字序列(25,84,21,47,15,27,68,35,20)進行排序,

序列的變化狀況採樣以下: 20,15,21,25,47,27,68,35,84 15,20,21,25,35,27,47,68,84 15,20,21,25,27,35,47,68,84 請問採用的是如下哪一種排序算法()

 
A、選擇排序
B、希爾排序
C、歸併排序
D、快速排序
選D。首先第一步以25爲基礎,小於25的放在25的左邊,大於25的放在25的右邊
  獲得20,15,21,25,47,27,68,35,84
第二步在25的兩邊分別進行快速排序,左邊以20爲基數,右邊以47爲基數      
  獲得15,20,21,25,35,27,47,68,84
第三步將,35,27這個子序列排序,                                       
  獲得15,20,21,25,27,35,47,68,84

20、設某課二叉樹中有360個結點,則該二叉樹的最小高度是()

A、10
B、9
C、8
D、7
選B。設二叉樹的高度爲n,則有: 2^n-1>360     
          2^(n-1) -1<360   且n爲正整數 n=9
相關文章
相關標籤/搜索