騰訊筆試真題及解析(一)


1.

以下代碼的運行情況:

int f( int a,  int b,  int c)
{
     return 0;
}
int main(){
     return  f( printf ( "a" ), printf ( "b" ), printf ( "c" ));
}
答案:cba

2.

var foo=”Hello”;
(function(){
     var bar=”World”;
     alert(foo+bar);
})();
alert(foo+bar);
其中 alert 兩次輸出結果為()
答案:
hello world報錯

解析:

//此函數是一個匿名自執行函數,會先調用並執行一次,即alert (foo+bar)的字符串拼接;
 
// var bar=”World”是函數內部聲明的局部變量,外部無法調用,所以外部的alert(foo+bar)會報錯。

3.

在Linux 上,對於多進程,子進程繼承了父進程的哪些東西?

1.共享內存;2.信號掩碼;3.已打開的文件描述符

注意:進程的地址空間子進程沒有從父進程當中繼承下來.

4.

在磁盤尋道中,有哪幾種方式,各個方式的尋道時間的計算.

5.

文件系統管理的最小磁盤空間單位是:簇

6.

IP地址為140.123.0.0的地址是B類地址,若要切割為10個子網,而且都要連接上Internet,請問子網掩碼應設為()

答案:255.255.240.0

解析:

默認的B類地址的子網掩碼是/16,也就是255.255.0.0

切割成10個子網的話,就得向主機位借2的四次方=16>10,即向主機位借4位.

所以子網掩碼要設置成/20,也就是255.255.240.0

7.

以下關於棧的說法錯誤的是:

A:在棧空的情況下,一定不能作出棧操作,否則產生溢出。

B:棧一定是順序存儲的線性結構。

C:空棧是所有元素都為0的棧。

D:一個棧的輸入序列為:A,B,C,D,可以得到輸出序列:C,A,B,D。

正確答案:BCD

8.

int f( int n) {
     if (n<=3)  return 1;
     else return f(n-2)+f(n-6)+1;
}
試問計算f(f(9))時需要計算()次f函數。
答案:12

9.

寢室有6個同學打dota,分為對立的兩方,一方是天災軍團,一方是近衛軍團。現請你設置賽程以及每場的對陣(每方最少1人、最多5人),請問至少得進行多少場比賽,才能使得賽程結束后每位同學都和其他同學做過對手()

答案:3

解析:用二進制來表示比賽的情況

用三位二進制來表示某個人三場比賽各場比賽所在的一方,比如我們用0代表在天災,1代表在近衛,那么000就代表這個人三場比賽都在天災,而001表示這個人前兩場比賽在天災,第三場比賽在近衛。那么三位二進制可以有8種表示,而每一種表示都與其他7種的表示至少在一個位置上的數字是不一樣的,所以最多8人至少三場可以每個人都做過對手。

10.

以下代碼打印的結果是:

struct st_t {
     int status;
     short *pdata;
     char errstr[32];
};
st_t st[16];
char *p=( char *)(st[2].esstr+32);
printf (“%d”,(p-( char *)(st)));
答案:144
解析:
根據字節對齊,在64位系統下struct st_t 結構體占用的字節為48個字節。
struct st_t {
int status;  //占用8個字節(后面的4個為對齊位)
short *pdata;//占用8個字節
char errstr[32];//占用32個字節
};
char *p=(char *)(st[2].esstr+32),p實際指向了st[3]
則p-(char *)(st)),即為&st[3]-&st[0],占用空間為3個結構體的大小,即3*48=144,選D

11.

設有2條路由21.1.193.0/24和21.1.194.0/24,如果進行路由匯聚,匯聚這兩條路由的地址是()

答案:21.1.192.0/21

解析:

參考路由匯聚算法了解該知識點。 193 = 1100,0001 194 = 1100,0010 193和194的前6位相同,因此掩碼長度為8+8+6 = 22。而1100,0000 = 192。 因此,最終答案為21.1.192.0/22。

但是題目選項中沒有該選項,因此,需要找一個包含正確答案的最佳選項,即21.1.192.0/21。正確答案是C。

12.

從一副標准撲克牌中抽牌,抽到黑色牌就繼續抽(不取出),直至抽到紅色牌,則停止。按照概率算,平均下來每次能抽到多少張黑牌?(也就是三國殺中甄姬的洛神技能,得到牌數的期望值)

答案:1

解析:這是一個離散的概率問問題

第一次抽到黑色概率為1/2,黑牌數期望為1*0.5=0.5
第二次抽到黑牌概率為1/4, 黑牌數期望為1*1/4=0.25
.....
第n次,黑牌期望為1/2^n
n趨於無窮大的時候,0.5+0.25+0.125+......=1

13.

下面關於DNS說法正確的是()

A:DNS的作用是域名和IP地址的相互映射

B:DNS協議運行在UDP協議之上

C:DNS協議端口號為53

D:DNS的默認緩存時間為1小時

答案:BC

14.

假設就緒隊列中有10個線程,系統將時間片設置為200ms,CPU進行線程切換要花費10ms。則系統開銷所占的比例約為()

答案:0.05

解析:

  • 操作系統的調度邏輯是:發生中斷->處理調度->發生中斷->處理調度...
  • 一個時間片長度就是兩次中斷發生之間的間隔。因此,系統開銷比率 = 調度耗時/時間片長度
  • 本題中,系統開銷比率 = 10/200 = 5% = 0.05

15.

下列程序的輸出結果是:

#include <stdio.h>
int main()
{
     const int N=10;
     const int M=2;
     int * a= new int [N];
     for ( int i=0;i<N;++i)
         a[i]=(0==i%2)?(i+2):(i+0);
     int (*b)[N/M]=( int (*)[N/M])a;
     for ( int i=0;i<M;++i)
         for ( int j=0;j<N/M;++j)
             printf (“%d”,b[i][j]);
     return 0;
}
答案:21436587109

解析:

int (*b)[N / M] = ( int (*)[N / M])a;   ==> int (*b)[5] = ( int (*)[5])a;

b為指向有五個元素數組的指針,a前面括號中是一個類型轉換,類型的含義是指向自身前五個元素的指針類型

但是輸出的時候,第二層外循環越界輸出 a 后五個元素

16.

在C++語言中,以下說法正確的是()

A:多態是通過虛表實現的

B:構造函數可以聲明為虛函數

C:析構函數不可以聲明為虛函數

D:抽象類中至少包含一個純虛函數

答案:AD

17.

class Base
{
      public :
          virtual     ~Base(){std::out<<”Base Destructor”<<std::endl;}
}
class Derived:  public Base
{
     public :
         ~Derived(){std::out<<”Derived     Destructor” <<std::endl;}
}
Base* p= new Derived();
delete p;
上面代碼在執行 delete p 時,控制台會輸出什么內容()
A:Base Destructor
B:Derived Destructor
C:Base Destructor
   Derived Destructor
D:Derived Destructor
    Base  Destructor

答案:D

解析:

析構的時候:先調用派生類的析構函數、然后調用基類的析構函數;與構造函數相反。

18.

下列說法錯誤的是?

A:struct聲明的類型是值類型
B:值類型是在堆上分配的
C:值類型不會被垃圾回收
D:值類型不需要指針來引用
E:引用類型在堆上分配,值類型在棧上分配

答案:B

解析:

1)范圍方面
C#的值類型包括:結構體(數值類型、bool型、用戶定義的結構體),枚舉,可空類型。
C#的引用類型包括:數組,用戶定義的類、接口、委托,object,字符串。

2)值類型與引用類型區別:

 

值類型

引用類型

存儲方式

直接存儲數據本身

存儲的是數據的引用,數據存儲在數據堆中

內存分配

分配在棧中的

分配在堆中

效率

效率高,不需要地址轉換

效率較低,需要進行地址轉換

內存回收

使用完后立即回收

使用完后不立即回收,而是交給GC處理回收

賦值操作

創建一個新對象

創建一個引用

類型擴展

不易擴展,所有值類型都是密封(seal)的,所以無法派生出新的值類型

具有多態的特性方便擴展

實例分配

通常是在線程棧上分配的(靜態分配),但是在某些情形下可以存儲在堆中

總是在進程堆中分配(動態分配)

19.

假設有如下這樣一個類:
class X
{
public:
void xoo(){}
};
請問sizeof(X)的值為多少?

答案:1

解析:

類的sizeof大小一般是類中的所有成員的sizeof大小之和,這個就不用多說。
不過有兩點需要注意:1)當類中含有虛成員函數的時候,例如:
class B
{
float a;
public:
virtual void fun(void);
}
此時sizeof(B)的大小為8,而不是4。因為在類中隱藏了一個指針,該指針指向虛函數表,正因為如此,
使得C++能夠支持多態,即在運行時綁定函數的地址。

20.

以下代碼輸出的值是:
int x=4;
void incre()
{
static int x=1;
x*=x+1;
printf(“%d”,x);
}
int _tmain(int argc,_TCHAR* argv[])
{
int I;
for(i=1;i<x;i++){
incre();
}
return 0;
}

答案:2642

解析:

在局部變量前加上“static”關鍵字,就成了靜態局部變量。靜態局部變量存放在內存的全局數據區。函數結束時,靜態局部變量不會消失,每次該函數調用 時,也不會為其重新分配空間。它始終駐留在全局數據區,直到程序運行結束。靜態局部變量的初始化與全局變量類似.如果不為其顯式初始化,則C++自動為其 初始化為0。
靜態局部變量與全局變量共享全局數據區,但靜態局部變量只在定義它的函數中可見。靜態局部變量與局部變量在存儲位置上不同,使得其存在的時限也不同,導致對這兩者操作 的運行結果也不同。

21.

下面代碼的執行結果是()
int main(void)
{
char *p[]={“TENCENT”,”CAMPUS”,”RECRUITING”};
char **pp[]={p+2,p+1,p};
char ***ppp=pp;
printf(“%s”,**++ppp);
printf(“%s”,*++*++ppp);
return 0;
}

答案: CAMPUS CAMPUS

解析:


從題干當中,我們可以畫出這樣的一個圖,這樣就比較直觀的看出了p,pp,ppp都指向哪里了,關鍵是最后兩個printf語句。
(1)printf(“%s”,**++ppp);即,ppp當前所指向的位置,再往下移一個位置,即pp的位置2,而pp的位置2指向的是p的位置2,p的位置2指向的是CAMPUS,所以先輸出CAMPUS

(2)printf(“%s”,*++*++ppp);這個語句等價於 printf(“%s”,*++(*++ppp));所以我們首先看,++ppp,第一個printf語句中ppp已經指向了pp的位置2,所以再往下移一個,指向了pp的位置3,而(*++ppp)則代表pp位置3所指向的內容,即p的位置1(pp的位置3指向的是p的位置1),在此基礎上前面再加上一個++,則代表指針p在位置1的基礎上再往下移動,即指針p的位置2,而p的位置2所指向的內容是CAMPUS,所以第二行輸出的也是CAMPUS。
所以正確答案是:CAMPUS CAMPUS

22.

64位機上,一個結構體有三個成員,分別是char、int、short類型,三個成員位於結構體中不同位置時整個結構體的大小可能是下面哪些值?

A.12
B.7
C.8
D.16

答案:AC

解析:

三個數據,一共6種排列:
int 4B char 1B short 2B
根據內存對齊原則:
1. char int short char1 + 空3 + int4 + short2 + 空2 = 12
2. char short int char1 + 空1 + short2 + int4 = 8
3. int short char int4 + short2 + char1 + 空1 = 8
4. int char short int4 + char1 + 空1 + short2 = 8
5. short int char short2 + 空2 + int4 + char1 + 空3 = 12
6. short char int short2 + char1 + 空1 + int4 = 8

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM