腾讯2012实习生笔试题2+答案解析

1、计算表达式x6+4x4+2x3+x+1最少需要做()次乘法

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

 

2、给定3个int类型的正整数x,y,z,对如下4组表达式判断正确的选项()

int a1=x+y-z; int b1=x*y/z;

int a2=x-z+y; int b2=x/z*y;

int c1=x<<y>>z; int d1=x&y|z;

int c2=x>>z<<y; int d2=x|z&y;

A、a1一定等于a2

B、b1一定定于b2

C、c1一定等于c2

D、d1一定等于d2

 

3、程序的完整编译过程分为是:预处理,编译,汇编等,如下关于编译阶段的编译优化的说法中不正确的是()

A、死代码删除指的是编译过程直接抛弃掉被注释的代码;

B、函数内联可以避免函数调用中压栈和退栈的开销

C、For循环的循环控制变量通常很适合调度到寄存器访问

D、强度削弱是指执行时间较短的指令等价的替代执行时间较长的指令

 

4、如下关于进程的描述不正确的是()

A、进程在退出时会自动关闭自己打开的所有文件

B、进程在退出时会自动关闭自己打开的网络链接

C、进程在退出时会自动销毁自己创建的所有线程

D、进程在退出时会自动销毁自己打开的共享内存

 

5、在如下8*6的矩阵中,请计算从A移动到B一共有多少种走法?要求每次只能向上挥着向右移动一格,并且不能经过P; 

A、492

B、494

C、496

D、498

 

6、SQL语言中删除一个表的指令是()

A、DROP TABLE

B、DELETE TABLE

C、DESTROY TABLE

D、REMOVE TABLE

 

7、某产品团队由美术组、产品组、client程序组和server程序组4个小组构成,每次构建一套完整的版本时,需要各个组发布如下资源。美术组想客户端提供图像资源(需要10分钟),产品组向client组合server提供文字内容资源(同时进行,10分钟),server和client源代码放置在不同工作站上,其完整编译时间均为10分钟切编译过程不依赖于任何资源,client程序(不包含任何资源)在编译完毕后还需要完成对程序的统一加密过程(10分钟)。可以请问,从要完成一次版本构建(client与server的版本代码与资源齐备),至少需要多少时间()

A、60分钟

B、40分钟

C、30分钟

D、20分钟

 

8、如下关于编译链接的说法错误的是()

A、编译优化会使得编译速度变慢

B、预编译头文件可以优化程序的性能

C、静态链接会使得可执行文件偏大

D、动态链接库会使进程启动速度偏慢

 

9、如下关于链接的说法错误的是()

A、一个静态库中不能包含两个同名全局函数的定义

B、一个动态库中不能包含两个同名全局函数的定义

C、如果两个静态库都包含一个同名全局函数,他们不能同时被链接

D、如果两个动态库都包含一个同名全局函数,他们不能同时被链接

 

10、排序算法的稳定是指,关键码相同的记录排序前后相对位置不发生改变,下面哪种排序算法是不稳定的()

A、插入排序

B、冒泡排序

C、快速排序

D、归并排序

 

11、下列说法中错误的是:()

A、插入排序某些情况下复杂度为O(n)

B、排序二叉树元素查找的复杂度可能为O(n)

C、对于有序列表的排序最快的是快速排序

D、在有序列表中通过二分查找的复杂度一定是O(n log2n)

 

12、在程序设计中,要对两个16K×16K的多精度浮点数二维数组进行矩阵求和时,行优先读取和列优先读取的区别是()

A、没区别

B、行优先快

C、列优先快

D、2种读取方式速度为随机值,无法判断

 

13、字符串www.qq.com所有非空子串(两个子串如果内容相同则只算一个)个数是()

A、1024

B、1018

C、55

D、50

 

14、TCP的关闭过程,说法正确的是()

A、TIME_WAIT状态称为MSL(Maximum Segment Lifetime)等待状态

B、对一个established状态的TCP连接,在调用shutdown函数之前调用close接口,可以让主动调用的一方进入半关闭状态

C、主动发送FIN消息的连接端,收到对方回应ack之前不能发只能收,在收到对方回复ack之后不能发也不能收,进入CLOSING状态

D、在已经成功建立连接的TCP连接上,如果一端收到RST消息可以让TCP的连洁端绕过半关闭状态并允许丢失数据。

 

15、操作系统的一些特别端口要为特定的服务做预留,必须要root权限才能打开的端口描述正确的是()

A、端口号在64512-65535之间的端口

B、所有小于1024的每个端口

C、RFC标准文档中已经声明特定服务的相关端口,例如http服务的80端口,8080端口等

D、所有端口都可以不受权限限制打开

 

16、找工作的季节马上就到了,很多同学去图书馆借阅《面试宝典》这本书,现在图书馆外有6名同学排队,其中3名同学要将手中的《面试宝典》还至图书馆,有3名同学希望从图书馆中可以借到《面试宝典》,若当前图书馆内已无库存《面试宝典》,要保证借书的3名同学可以借到书,请问这6位同学有多少种排队方式()

A)60

B)120

C)180

D)360

二、填空题

1、除了10进制、2进制之外,16进制表达式在计算机领域中也经常使用(例如各种字符集的定义描述),下式:(2012)10+(AF1)16的结果是(     )(请用10进制表示)。

 

2、ack(3 , 3)的执行结果是多少?

  1. int ack(int m,int n) 
  2.     if(m == 0) 
  3.         return n + 1; 
  4.     else if(n == 0) 
  5.         return ack(m-1,1); 
  6.     else 
  7.         return ack(m - 1 , ack(m , n-1)); 

 

3、某互联网产品(例如,一款网络游戏)同时在线曲线(Average Concurrency Users,ACU)24小时数据如下图所示。现已知全天平均在线人数为5000人,玩家每次登陆后平均在线时长为2小时。请你估计一下,平均下来每分钟约有(         )个玩家登录。

 

 

4、如下SQL语句是需要列出一个论坛版面第一页(每页显示20个)的帖子(post)标题(title),并按照发布(create_time)降序排列:

SELECT title FROM post( )create_time DESC( )0,20

 

5、为了某项目需要,我们准备构造了一种面向对象的脚本语言,例如,对所有的整数,我们都通过Integer类型的对象来描述。在计算“1+2”时,这里的“1”,“2”和结果“3”分别为一个Integer对象。为了降低设计复杂度,我们决定让Integer对象都是只读对象,也即在计算a=a+b后,对象a引用的是一个新的对象,而非改a所指对象的值。考虑到性能问题,我们又引入两种优化方案:(1)对于数值相等的Integer对象,我们不会重复创建。例如,计算“1+1”,这里两个“1”的引用的是同一个对象——这种设计模式叫做();(2)脚本语言解析器启动时,默认创建数值范围[1,32]的32个Integer对象。现在,假设我们要计算表达式“1+2+3+…+40”,在计算过程需要创建的Integer对象个数是()。

 

6、甲、乙两个人在玩猜数字游戏,甲随机写了一个数字,在[1,100]区间之内,将这个数字写在了一张纸上,然后乙来猜。
如果乙猜的数字偏小的话,甲会提示:“数字偏小”
一旦乙猜的数字偏大的话,甲以后就再也不会提示了,只会回答“猜对 或 猜错”
问: 乙至少猜       多少次  猜可以准确猜出这个数字,在这种策略下,  乙猜的第一个数字是     

 

7、仔细阅读以下函数

Int fuc(int m,int n)

{

if(m%n)==0

{

return n;

}

else

{

       return fuc(n,m%n)

}

}

 

请问func(2012,2102)的结果是(              )。

 

加分题:

1、给定一个数组a[N],我们希望构造数组b[N],其中b[i]=a[0]*a[1]*...*a[N-1]/a[i]。在构造过程:
不允许使用除法;
要求O(1)空间复杂度和O(n)时间复杂度;
除遍历计数器与a[N] b[N]外,不可使用新的变量(包括栈临时变量、对空间和全局静态变量等);
请用程序实现并简单描述。

 

2、20世纪60年代,美国心理学家米尔格兰姆设计了一个连锁信件实验。米尔格兰姆把信随即发送给住在美国各城市的一部分居民,信中写有一个波士顿股票经纪人的名字,并要求每名收信人把这封信寄给自己认为是比较接近这名股票经纪人的朋友。这位朋友收到信后再把信寄给他认为更接近这名股票经纪人的朋友。最终,大部分信件都寄到了这名股票经纪人手中,每封信平均经受6.2词到达。于是,米尔格兰姆提出六度分割理论,认为世界上任意两个人之间建立联系最多只需要6个人。

假设QQ号大概有10亿个注册用户,存储在一千台机器上的关系数据库中,每台机器存储一百万个用户及其的好友信息,假设用户的平均好友个数大约为25人左右。

第一问:请你设计一个方案,尽可能快的计算存储任意两个QQ号之间是否六度(好友是1度)可达,并得出这两位用户六度可达的话,最短是几度可达。

第二问:我们希望得到平均每个用户的n度好友个数,以增加对用户更多的了解,现在如果每台机器一秒钟可以返回一千条查询结果,那么在10天的时间内,利用给出的硬件条件,可以统计出用户的最多几度好友个数?如果希望得到更高的平均n度好友个数,可以怎样改进方案?

 

3、段页式虚拟存储管理方案的特点。

 

 

参考答案(欢迎讨论) 转载请注明来源 http://www.cnblogs.com/jerry19880126/

选择题:

  1. A。原式=x^2 * (x^4 + 4 * x^2 + 2*x) + x + 1,x^2用一次乘法,x^4看成是(x^2)^2,这样用掉第二次乘法,外面的x^2 * () 是第三次乘法,所有常系数乘法都展开成连加。
  2. A。一开始觉得A肯定不对,因为会溢出,但不知道其实正如微机原理课上原的,溢出会有标识位,连加减的时候会考虑到这个标识位的作用,这样A就对了。
  3. A。死代码是指永远不会执行到的代码,不是注释,比如if(0){…},大括号里的就是死代码。
  4. D。共享内存销毁了,会对其他正在使用这段内存的进程造成破坏。
  5. A。A走到B共需要12步,其中7步必须向右,5步必须向上,但次序可以不同,因此是C(7,12),要求P不能走,那么走到P的可能次数是C(3,6),从P走到B的可能次数是C(4,6),因此结果是C(7,12) – C(3,6)*C(4,6)=492。
  6. A。
  7. D。除了加密以外,剩下的事情在第一个10分钟内可以并发完成。
  8. B
  9. C。
  10. C。快排选主元会打乱原次序。
  11. C。A当数据完全有序时就是O(n),B当数退化成线性表时(只有一叉时)出现,C快排只对无序、随机序列有优势。D是对的。
  12. B。
  13. D。长度1的子序列有10-2-1-1=6个,长度2子序列有9-1=8个,长度3有8个,长度4有7个…长度10有1个,加起来就是50。
  14. D。
  15. C。
  16. C。卡特兰数,C(n,2n)/(n+1),n是入栈元素的个数,这里n=3,C(3,6)/4=5,同学彼此是不同的,因此要全排列一下,结果为5*3!*3!=180。

 

填空题:

  1. 4813。
  2. 61。这个有规律的,只要耐心一点就行了,ack(1,x)=2+x,ack(2,x)=3+x*2,ack(3,0)=5,ack(3,1)=ack(3,0)*2+3=13,ack(3,2)=ack(3,1)*2+3=29,ack(3,3)=ack(3,2)*3+2=61。
  3. 不会。
  4. ORDER BY; LIMIT
  5. 享元模式,40。1到7以及他们的和是不用创建的,从8开始,28(是1到7的和)+8=36,36需要创建,36+9=45,45需要创建…依次类推,在加数是32之前(含32)需要创建的对象是32-8+1=25,某数+32=某数之后33至40所表示的加数也要创建,这样有8个加数 + 8个和,共有16个数需要创建,注意,加数中包含36,这个我们已经创建了,所以有25+8+8-1=40个数的对象需要创建。
  6. 14次,第一次猜测数字为14。思想是:每次猜大后,尝试猜测的总次数是相等的。第一次猜测时,在1到100之间选择某个数N1后,有三种情况,一是直接选中了,这个概率比较小,对研究没有意义,二是选择偏大了,这时不再提示了,只能在1至N1-1之间一个一个地选了,三是选择偏小了,这时还有提示,可以继续在[N1+1,100]中选择另外的数N2。可以知道,若第一次就猜错了,那么尝试总次数是N1-1+1=N1次(因为是在[1,N1-1]之间逐一取值,且N1本身用掉一次),若第一次猜得偏小,但第二次猜大了,尝试总次数是[N1+1,N2-1]的元素个数加2(加2是N2和N1本身猜用掉一次),即为N2-N1+1次,根据思想“每次猜错后,尝试猜测的总次数相等”,有N1=N2-N1+1,可知N2=2N1-1,增量为N1-1。类似地,前两次猜得偏小,但第三次猜大,尝试总次数为[N2+1,N3-1]的元素个数加3,即N3-N2+2,那么有N3-N2+2=N1,N3=N2+N1-2,增量为N1-2……依此类推,增量是随着猜测次数的增加而逐1地减少。设最后一次猜测为k,则Nk=N1+(N1-1)+(N1-2)+…1,Nk是等于或大于100的第一个数,根据等差数列求和公式可以算出N1=14,N2=27,N3=39…(14,27,39,50,60,69,77,84,90,95,99)。
  7. 2。递归。

 

加分题:

1、思想是将数组a[j]分成两部分看,先算其前半部分a[0]…a[j-1],然后再乘以其后半部分a[j+1]…a[N-1]。具体代码见CPP程序。

数组分割
 1 #include <iostream>
 2 using namespace std;
 3 
 4 
 5 /************************************************************************/
 6 /*
 7 打印数组
 8 */
 9 /************************************************************************/
10 void output(long long* a, int len)
11 {
12     for(int i = 0; i < len; ++i)
13     {
14         cout << a[i] << " ";
15     }
16     cout << endl;
17 }
18 
19 /************************************************************************/
20 /*
21 题目要求的算法
22 */
23 /************************************************************************/
24 void problem(int* a, long long* b, int N)
25 {
26     b[0] = 1;
27     for(int i = 1; i < N; ++i)
28     {
29         b[i] = b[i-1] * a[i-1]; // 分水岭的前半段乘积
30     }
31 
32     b[0] = a[N - 1];
33     for(int i = N - 2; i >= 1; --i)
34     {
35         b[i] *= b[0];
36         b[0] *= a[i]; // 分水岭的后半段乘积,是从数组尾部向前循环的
37     }
38 }
39 
40 
41 
42 
43 int main()
44 {
45     const int N = 10;
46     int a[N] = {1,7,4,3,4,2,5,3,7,3};
47     long long multipleResult = 1; // 用long long类型防止数据溢出
48     long long refer[N];
49     for(int i = 0; i < N; ++i)
50     {
51         multipleResult *= a[i];
52     }
53     for(int i = 0; i < N; ++i)
54     {
55         refer[i] = multipleResult / a[i]; //参考结果
56     }
57     cout << "参考结果:" << endl;
58     output(refer, N);
59 
60     
61     long long b[N];
62     problem(a, b, N);
63     cout << endl << endl << "满足题意运行的结果:" << endl;
64     output(b, N);
65 
66     return 0;
67 }

 

2、不会。

3、不会。参考网友hackbuteer1的答案如下:

答:空间浪费小、存储共享容易、存储保护容易、能动态连接。
段页式管理是段式管理和页式管理结合而成,兼有段式和页式管理的优点,每一段分成若干页,再按页式管理,页间不要求连续(能动态连接);用分段方法分配管理作业,用分页方法分配管理内存(空间浪费小)。

段页式管理采用二维地址空间,如段号(S)、页号(P)和页内单元号(D);系统建两张表格每一作业一张段表,每一段建立一张页表,段表指出该段的页表在内存中的位置;地址变换机构类似页式机制,只是前面增加一项段号。所以存储共享容易、存储保护容易。

 

 

posted @ 2012-08-13 21:32  Jerry19880126  阅读(23007)  评论(34编辑  收藏  举报