腾讯2012笔试题

参考来源:html

http://www.cnblogs.com/jerry19880126/ios

http://blog.csdn.net/kingjinzi_2008/article/details/7785334面试

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

A、3                 B、4                  C、5                       D、6数据库

A。原式=x^2 * (x^4 + 4 * x^2 + 2*x) + x + 1,x^2用一次乘法,x^4当作是(x^2)^2,这样用掉第二次乘法,外面的x^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;ide

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

A、a1必定等于a2

B、b1必定定于b2

C、c1必定等于c2

D、d1必定等于d2

A。

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

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

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

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

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

A。死代码是指永远不会执行到的代码,不是注释,好比if(0){…},大括号里的就是死代码。

四、以下关于进程的描述不正确的是()

A、进程在退出时会自动关闭本身打开的全部文件

B、进程在退出时会自动关闭本身打开的网络连接

C、进程在退出时会自动销毁本身建立的全部线程

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

D。共享内存销毁了,会对其余正在使用这段内存的进程形成破坏。

 

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

A、492

B、494

C、496

D、498

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。

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

A、DROP TABLE

B、DELETE TABLE

C、DESTROY TABLE

D、REMOVE TABLE

A。不说了,

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

A、60分钟

B、40分钟

C、30分钟

D、20分钟

D。除了加密之外,剩下的事情在第一个10分钟内能够并发完成。

八、以下关于编译连接的说法错误的是()

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

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

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

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

B。优化编译

九、以下关于连接的说法错误的是()

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

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

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

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

C。静态库中编译器保证没有同名函数,两个静态库,编译完成后,会在不一样类库,同名函数上加上一些参数或者其余特定信息,从而在调用时区别,若是两个动态库都包含一个同名全局函数,他们不能同时被连接,由于全局函数是定义在类外的函数,成员函数就是定义在类中的函数

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

A、插入排序

B、冒泡排序

C、快速排序

D、归并排序

基础题,C。

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

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

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

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

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

C。A当数据彻底有序时就是O(n),B当数退化成线性表时(只有一叉时)出现,C快排只对无序、随机序列有优点。D是对的。

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

A、没区别

B、行优先快

C、列优先快

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

B。

1三、字符串www.qq.com全部非空子串(两个子串若是内容相同则只算一个)个数是()

A、1024

B、1018

C、55

D、50

D.

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

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

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

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

D、在已经成功创建链接的TCP链接上,若是一端收到RST消息可让TCP的链接端绕过半关闭状态并容许丢失数据。

D。//TIME_WAIT 是TCP连接断开时一定出现的状态,TCP下每条链接都有一个属性叫作max segment lifetime,就是说该链接关闭后,要通过2*max segment lifetime的时间,才算是真正的被关闭,才能被从新创建,以防止这条链路上还有东西在传输,停留在TIME_WAIT状态的持续时间是最长分节生命周期(MSL)的两倍,有时候称之为2MSL

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

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

B、全部小于1024的每一个端口

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

D、全部端口均可以不授权限限制打开

C。

1六、找工做的季节立刻就到了,不少同窗去图书馆借阅《面试宝典》这本书,如今图书馆外有6名同窗排队,其中3名同窗要将手中的《面试宝典》还至图书馆,有3名同窗但愿从图书馆中能够借到《面试宝典》,若当前图书馆内已无库存《面试宝典》,要保证借书的3名同窗能够借到书,请问这6位同窗有多少种排队方式()

A)60

B)120

C)180

D)360

C。卡特兰数,C(n,2n)/(n+1),n是入栈元素的个数,这里n=3,C(3,6)/4=5,同窗彼此是不一样的,所以要全排列一下,结果为5*3!*3!=180

2、填空题

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

4813

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

int ack(int m,int n) 

    if(m == 0) 
        return n + 1; 
    else if(n == 0) 
        return ack(m-1,1); 
    else 
        return ack(m - 1 , ack(m , n-1)); 

 

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。

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

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

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

ORDER BY; LIMIT, 推荐SQL《学习指南》 

五、为了某项目须要,咱们准备构造了一种面向对象的脚本语言,例如,对全部的整数,咱们都经过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对象个数是()。

享元模式,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个数的对象须要建立。

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

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)。

http://blog.csdn.net/kingjinzi_2008/article/details/7785334

引入;

一道关于动态规划的面试题——Google面试题:扔玻璃珠
某幢大楼有100层。你手里有两颗如出一辙的玻璃珠。当你拿着玻璃珠在某一层往下扔的时候,必定会有两个结果,玻璃珠碎了或者没碎。这幢大楼有个临界楼层。低于它的楼层,往下扔玻璃珠,玻璃珠不会碎,等于或高于它的楼层,扔下玻璃珠,玻璃珠必定会碎。玻璃珠碎了就不能再扔。如今让你设计一种方式,使得在该方式下,最坏的状况扔的次数比其余任何方式最坏的次数都少。也就是设计一种最有效的方式。
首先,为了保存下一颗玻璃珠本身玩,就采用最笨的办法吧:从第一层开始试,每次增长一层,当哪一层扔下玻璃珠后碎掉了,也就知道了。不过最坏的状况扔的次数可能为100。
固然,为了这一颗玻璃珠代价也高了点,仍是采起另一种办法吧。随便挑一层,假如为N层,扔下去后,若是碎了,那就只能从第一层开始试了,最坏的状况可能为N。假如没碎,就一次增长一层继续扔吧,这时最坏的状况为100-N。也就是说,采用这种办法,最坏的状况为max{N, 100-N+1}。之因此要加一,是由于第一次是从第N层开始扔。
不过仍是以为不够好,运气好的话,挑到的N可能恰好是临界楼层,运气很差的话,要扔的次数仍是不少。不过回过头看看第二种方式,有没有什么发现。假如没摔的话,不如不要一次增长一层继续扔吧,而是采起另一种方式:把问题转换为100-N,在这里面找临界楼层,这样不就把问题转换成用递归的方式来解决吗?看下面:
假如结果都保存在F[101]这个数组里面,那么:
F[N]=100-N,
F[100]=min(max(1,1+F[N-1]),max(2,1+F[N-2]),……,max(N-1,1+F[1]));
看出来了没有,其实最终就是利用动态规划来解决这个问题。
下面是本身随便写的C++代码:
[cpp] view plaincopy
#include<iostream>  
using namespace std;  
int dp[101] = { 0 };  
void solve()  
{  
    int i , j , k;  
    for(i = 2 ; i < 101 ; ++i)  
    {  
        dp[i] = i;  
        for(j = 1 ; j < i ; ++j)  
        {  
            k = (j>=(1 + dp[i-j])) ? j : (1 + dp[i-j]);  
            if(dp[i] > k)  
                dp[i] = k;  
        }  
    }  
}  
int main(void)  
{  
    dp[0] = 0 , dp[1] = 1;  
    solve();  
    printf("%d\n",dp[100]);  
    return 0;  
}  
输出结果为14。也就是说,最好的方式只要试14次就可以得出结果了。
答案是先从14楼开始抛第一次;若是没碎,再从27楼抛第二次;若是还没碎,再从39楼抛第三次;若是还没碎,再从50楼抛第四次;如此,每次间隔的楼层少一层。这样,任何一次抛棋子碎时,都能确保最多抛14次能够找出临界楼层。
证实以下:
一、第一次抛棋子的楼层:最优的选择必然是间隔最大的楼层。好比,第一次若是在m层抛下棋子,之后再抛棋子时两次楼层的间隔必然不大于m层(你们能够本身用反证法简单证实)
二、从第二次抛棋子的间隔楼层最优的选择必然比第一次间隔少一层,第三次的楼层间隔比第二次间隔少一层,如此,之后每次抛棋子楼层间隔比上一次间隔少一层。(你们不妨本身证实一下)
三、因此,设n是第一次抛棋子的最佳楼层,则n即为知足下列不等式的最小天然数:
  不等式以下:  1+2+3+...+(n-1)+n  >=   100
由上式可得出n=14
即最优的策略是先从第14层抛下,最多抛14次确定能找出临界楼层。

 

七、仔细阅读如下函数

Int fuc(int m,int n)

{

if(m%n)==0

{

return n;

}

else

{

       return fuc(n,m%n)

}

}

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

2。递归。,其实就是求最小公倍数,

加分题:

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

请参考http://www.mianwww.com/html/2012/11/17098.html,有扩展思路,值得学习、。

继续观察b[i]的结构发现,b[i]能够写成BaBb,其中Ba=a[0]*a[1]…*a[i-1],Bb=a[i+1]*a[i+2]…*a[n-1],天然的就联想到了分别从头和尾部遍历a[n]计算Ba,Bb的方法

 

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

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

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

第二问:咱们但愿获得平均每一个用户的n度好友个数,以增长对用户更多的了解,如今若是每台机器一秒钟能够返回一千条查询结果,那么在10天的时间内,利用给出的硬件条件,能够统计出用户的最多几度好友个数?若是但愿获得更高的平均n度好友个数,能够怎样改进方案?

三、段页式虚拟存储管理方案的特色。

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

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