腾讯笔试真题及解析(一)

2018/03/06 16:58
阅读数 19

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

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部