天天看點

【面試題】 迅雷2014校園招聘筆試題

溫馨提示:客觀題和主觀題得分都要超過一定标準,才能獲得面試資格,如果一項得分很高,而另外一項得分很低,可能無法獲得面試資格。

答案僅供參考,不保證完全正确

一、單選題(20題,每題2分)

1、有變量int i = 0; int a = i++; int b=++a; int c = a+b; 請問表達式 a?b:c 的值是()

A、0              

B、1

              C、2             D、3

2、32位環境下,int *p=new int[10];請問sizeof(p)的值為()

A、4 

             B、10              C、40               D、8

3、有語句char str[] = "abcde";請問表達式sizeof(str)的值是()    後面還有\0

A、1              B、4               C、5                

D、6

4、有函數int func(int i)的實作為()

int func(int i)
{
  if(i > 1)
    return i*func(i-1);
  else
    return 1;
}      

請問函數調用f(5)的傳回值是多少()階乘計算

A、5              B、15              C、20              

 D、120

5、請問以下說法,哪個是正确的()

A、每個類都有一個無參數的構造函數

B、每個類都有一個拷貝構造函數

C、每個類能有多個構造函數

D、每個類能有多個析構函數

6、用class關鍵字定義的類,其成員預設的通路屬性為()

A、private 

        B、protected      C、public           D、無定義

7、類的成員有三種通路屬性,分别是public、protected、private,子類能夠通路的成員是()

A、都能通路

B、public和protected

C、public和private

D、protected和private

8、請問對一個排好序的數組進行查找,時間複雜度為()

A、O(n)           

 B、O(lgn)

      C、O(nlgn)          D、O(1)

9、以下二叉樹:

【面試題】 迅雷2014校園招聘筆試題

後序周遊的結果是()

A、丙乙丁甲戊己              B、甲乙丙丁戊己              

C、丙丁乙己戊甲

                  D、丙丁己乙戊甲

10、看以下代碼:

A *pa = new A[10];

delete pa;

則類A的構造函數和析構函數分别執行了幾次()

A、1   1          B、10   10          C、1   10                

D、10   1

11、看以下代碼:

class A
{
public:
  ~A();
};
A::~A()
{
  printf("delete A ");
}

class B : public A
{
public:
  ~B();
};
B::~B()
{
  printf("delete B ");
}      

請問執行以下代碼

A *pa = new B();

delete pa;

輸出的串是()A

A、delete A 

      B、delete B        C、delete B delete A          D、delete A delete B

12、檔案長度是一個大于0的整數,用變量unsigned file_length; 來表示,把檔案分成塊,每塊的長度也是一個大于0的整數,用變量unsigned block_length; 來表示,則檔案被分成的塊數為()

A、file_length/block_length                                            B、file_length/block_length+1         

C、(file_length+block_length-1)/block_length                

D、((file_length-1)/block_length+1 

13、整數int i = 0xFE78DA45; int k = 0xAC3189B2;則i^k的值為()

A、0x524953f7

         B、0xAC308800          C、0xFE79DBF7           D、0X0000001

14、看以下代碼:

class parent
{
public:
  virtual void output();
};
void parent::output()
{
  printf("parent!");
}

class son : public parent
{
public:
  virtual void output();
};
void son::output()
{
  printf("son!");
}      

則以下程式段:

son s;

::memset(&s , 0 , sizeof(s));

parent& p = s;

p.output();

執行結果是()

A、parent!       B、son!       C、son!parent!           

D、沒有輸出結果,程式運作出錯

15、函數的局部變量所需存儲空間,是在哪裡配置設定的()

A、程序的資料段      B、程序的棧上    C、程序的堆上       

D、以上都可以

16、以下STL的容器存放的資料,哪個肯定是排好序的()

A、vector        B、deque         C、list             

D、map

17、int a[][3]={{1},{3,2},{6,7,8},{9}};中a[2][1]的值是()

A、3          B、6        C、2           

 D、7

18、以下關于頭檔案,說法正确的是()

A、#include<filename.h>,編譯器尋找頭檔案時,會從目前編譯的源檔案所在的目錄去找

B、#include“filename.h”,編譯器尋找頭檔案時,會從通過編譯選項指定的目錄去找

C、多個源檔案同時用到的全局整數變量,它的聲明和定義都放在頭檔案中,是好的程式設計習慣

D、在大型項目開發中,把所有自定義的資料類型、全局變量、函數聲明都放在一個頭檔案中,各個源檔案都隻需要包含這個頭檔案即可,省去了要寫很多#include語句的麻煩,是好的程式設計習慣。

19、某棵完全二叉樹上有699個節點,則該二叉樹的葉子節點數為()

A、349             B、350              C、188                D、187

n0=n2+1;

n=n0+n1+n2=n0+n1+n0-1=699 

由于完全二叉樹中度為1的節點隻有0個或1個兩種情況,是以,将0或1帶入上面公式,整理後得:  n0=(n+1)/2或者n0=n/2;  看看n是否能被2整除,能則用n0=n/2。否則用n0=(n+1)/2 既葉子節點為n0=(n+1)/2=350

20、在一個指向字元串的指針char *p_str,要把字元串中第4個字元的值改為'a',正确的做法是()

A、p_str[3]='a'            

B、*(ptr+3)='a' 

     C、p_str[4]='a'       D、*(ptr+4)='a'

二、多選題(10題,每題3分,錯選漏選都不得分)

1、已知一段文本有1382個字元,使用了1382個位元組進行存儲,這段文本全部是由a、b、c、d、e這5個字元組成,a出現了354次,b出現了483次,c出現了227次,d出現了96次,e出現了232次,對這5個字元使用哈夫曼(Huffman)算法進行編碼,則以下哪些說法正确()

A、使用哈夫曼算法編碼後,用編碼值來存儲這段文本将花費最少的存儲空間

B、使用哈夫曼算法進行編碼,a、b、c、d、e這5個字元對應的編碼值是唯一确定的

C、使用哈夫曼算法進行編碼,a、b、c、d、e這5個字元對應的編碼值可以有多套,但每個字元編碼的位(bit)數是确定的

D、b這個字元的哈夫曼編碼值位數應該最短,d這個字元的哈夫曼編碼值位數應該最長

2、下清單達式中,不合法的是()

已知:double d = 3.2; int n = 3;

A、d<<2;

B、d/n

C、!d && (n-3)

D、(d-0.2)|n

3、下面描述正确的是()

A、while循環語句的循環體至少執行1次

B、do-while循環可以寫成while循環的格式

C、continue語句可以出現在各種循環體中

D、break語句不可以出現在循環體内

4、關于内聯函數正确的是()

A、類的私有成員函數不能作為内聯函數

B、在所有類說明中内部定義的成員函數都是内聯函數

C、類的保護成員函數不能作為内聯函數

D、使用内聯函數的地方會在運作階段用内聯函數體替換掉

5、下面模闆聲明中,哪些是非法的()

A、template<class Type>class C1;

B、template<class T,U , class V>class C2;

C、template<class C1 , typename C2>class C3{};

D、template<typename myT , class myT>class C4{};

6、在使用浏覽器打開一個網頁的過程中,浏覽器會使用的網絡協定包括()

A、DNS         B、TCP        C、HTTP  

          D、Telnet

7、下面屬于構造散列函數的方法是()

A、直接定址法

B、數字分析法

C、乘餘取整法

D、平方取中法

8、拷貝構造函數的特點是()

A、該函數名同類名,也是一種構造函數,該函數傳回自身引用

B、該函數隻有一個參數,必須是對某個對象的引用

C、每個類都必須有一個拷貝初始化構造函數,如果類中沒有說明拷貝構造函數,則編譯器系統會自動生成一個預設拷貝構造函數,作為該類的保護成員

D、拷貝初始化構造函數的作用是将一個已知對象的資料成員值拷貝給正在建立的另一個同類的對象

9、下列關于虛函數的說法正确的是()

A、在構造函數中調用類自己的虛函數,虛函數的動态綁定機制還會生效。

B、在析構函數中調用類自己的虛函數,虛函數的動态綁定機制還會生效。

C、靜态函數不可以是虛函數

因為靜态成員函數沒有this,也就沒有存放vptr的地方,同時其函數的指針存放也不同于一般的成員函數,其無法成為一個對象的虛函數的指針以實作由此帶來的動态機制。靜态是編譯時期就必須确定的,虛函數是運作時期确定的。

D、虛函數可以聲明為inline

inline函數和virtual函數有着本質的差別,inline函數是在程式被編譯時就展開,在函數調用處用整個函數體去替換,而virtual函數是在運作期才能夠确定如何去調用的,因而inline函數展現的是一種編譯期機制,virtual函數展現的是一種運作期機制。

是以,内聯函數是個靜态行為,而虛函數是個動态行為,他們之間是有沖突的。

函數的inline屬性是在編譯時确定的, 然而,virtual的性質則是在運作時确定的,這兩個不能同時存在,隻能有一個選擇,檔案中聲明inline關鍵字隻是對編譯器的建議,編譯器是否采納是編譯器的事情。

我并不否認虛函數也同樣可以用inline來修飾,但你必須使用對象來調用,因為對象是沒有所謂多态的,多态隻面向行為或者方法,但是C++編譯器,無法保證一個内聯的虛函數隻會被對象調用,是以一般來說,編譯器将會忽略掉所有的虛函數的内聯屬性。

相關知識點:

什麼函數不能聲明為虛函數?

一個類中将所有的成員函數都盡可能地設定為虛函數總是有益的。

設定虛函數須注意: 

1:

隻有類的成員函數才能說明為虛函數; 

2:靜态成員函數不能是虛函數; 

3:内聯函數不能為虛函數; 

4:構造函數不能是虛函數; 

5:析構函數可以是虛函數,而且通常聲明為虛函數。

10、下列對函數double add(int a , int b)進行重載,正确的是()

A、int add(int a ,int b ,int c)

B、int add(double a , double b)

C、double add(double a , double b)

D、int add(int a , int b)

三、填空題(15空,每空2分)

1、以下代碼是用來計算100以内的素數的個數,請把相應的空填上。

struct prime_number_node
{
  int prime_number;
  prime_number_node* next;
};

int calc_prime_number()
{
  prime_number_node* list_head = new prime_number_node();
  list_head->next = NULL;
  list_head->prime_number = 2;
  prime_number_node* list_tail = list_head;
  for(int number = 3 ; number < 100 ; number++)
  {
    int remainder;
    prime_number_node* cur_node_ptr = list_head;
    while(cur_node_ptr != NULL)
    {
      remainder = number%cur_node_ptr->prime_number;
      if(remainder == 0)
      {
        //1
      }
      else
      {
        //2
      }
    }
    if(remainder != 0)
    {
      prime_number_node* new_node_ptr = new prime_number_node(); 
      new_node_ptr->prime_number = number;
      new_node_ptr->next = NULL;
      list_tail->next = new_node_ptr;
      //3
    }
  }
  int result = 0;
  while(list_head != NULL)
  {
    result++;
    prime_number_node* temp_ptr = list_head;
    list_head = list_head->next;
    //4
  }
  return result;
}      

1、2、3、4四行代碼依次為:break;

cur_node_ptr = cur_node_ptr->next;

list_tail = list_tail->next; 

delete temp_ptr;

2、已知集合A和B的元素分别用不含頭結點的單連結清單存儲,函數difference()用于求解集合A與B的差集,并将結果儲存在集合A的單連結清單中。例如,若集合A={5,10,20,15,25,30},集合B={5,15,35,25},完成計算後A={10,20,30}。

連結清單結點的結構類型定義如下:

struct node
{
  int elem;
  node* next;
};

void difference(node** LA , node* LB)
{
  node *pa , *pb , *pre , *q;
  pre = NULL;
              //1
  while(pa)
  {
    pb = LB;
    while(   )                 //2
      pb = pb->next;
    if(    )                   //3
    {
      if(!pre)
        *LA =      ;     //4
      else
         = pa->next;     //5
      q = pa;
      pa = pa->next;
      free(q);
    }
    else
    {
             ;             //6
      pa = pa->next;
    }
  }
}      

1、2、3、4、5、6六行代碼依次為

pa = *LA;

pb && pa->elem != pb->elem

pb

pa->next

pre->next

pre = pa;

代碼中的指針pa用于指向集合A的元素;pb指向集合B的元素;臨時指針q指向需要被删除的元素;pre用于實作删除時結點的連結,與pa保持所指結點的前後繼關系。

繼續閱讀