1、腾讯实习生招聘笔试题目下面是我在参加2013年腾讯实习生招聘的笔试题目,当然啦,我个人不可能是完全的记住所有题目,部分是摘自网络的。同时,下面也有一些题目我不会的,希望大家一起商量解决给以答案,谢谢。选择题32位机上根据下面的代码,问哪些说法是正确的?() signed char a = 0xe0; unsigned int b = a; unsigned char c = a; A. a0& c0为真 B. a = c 为真 C. b 的十六进制表示是:0xffffffe0 D.上面都不对答案:C考点:有符号数和无符号数之间的转换解析: 将0xe0转换成二进制是1110 0000,因为0xe
2、0的最高位是1,所以作为有符号数的时候就是负数,作为无符号数的时候就是正数,因此A选项是错的,同时B也是错误的。 负数的高位用1补齐,正数的高位用0补齐,所以b(0xe0)的二进制表示形式是1111 1111 1111 1111 1111 1111 1110 0000,十六进制的表示形式是0xffffffe0。下面哪些选项能编译通过?int i;char a10; string f(); string g(string&str); A. if(!i)f(); B. g(f(); C. a=a+1; D. g(abc); 答案:A考点:C+的细节掌握。解析: A是肯定对的,因为他有一个默认值。
3、B选项是错误的。因为f() 返回的是一个临时量,然后传给 g 函数,而 g 的参数不是const 引用,是不能引用临时量的。 C选项是错误的。因为a 是一个地址常量,不可能再被赋值。 D选项是错误的。因为abc 的类型可是 const char* 呢,是个常量指针(可以用来初始化 string)。(对这题我有点疑问,因为我不是学C+的,所以希望读者看到可以帮我解答一下,谢谢)int a10; 问下面哪些不可以表示 a1 的地址?A. a+sizeof(int)B. &a0+1C. (int*)&a+1D. (int*)(char*)&a+sizeof(int)答案:A考点:C+数组的指针表示形
4、式的掌握解析: A. a+sizeof(int)选项不正确,假设在32位机器上,sizeof(int)的值为4,而a+sizeof(int)相当于指针运算 a + 4,也就是a4 B. &a0+1选项正确,因为&a0的意思是取的数组首元素地址,而数组首元素地址加1(a + 1),根据指针运算就是a1的地址 C. (int*)&a+1选项正确,因为数组地址被强制类型转换为int*,然后加1,这样和B表示的一个意思 D.(int*)(char*)&a+sizeof(int)选项正确,因为数据地址先被转换为char*,然后加4,根据指针运算公式,向前移动4 * sizeof(char),之后被转换为
5、int*,显然是a1的地址问下面的数据都存放在哪些存储区?int main()char *p = hello,world;return0;A. 堆和静态数据区B. 栈和静态数据区C. 栈和常量区D. 栈和堆答案:C解析:其实,在做这一题的时候,我是当成Java来做的,呵呵 根据C语言中的特性和定义p是一个局部变量,而C语言中局部变量存在于栈中,hello wrold是一个字符串字面常量,因此存储于程序的只读存储区中,p在这里其实只是指向了hello wrold在只读存储区中的地址而已4)下面哪些说法正确?() A. 数组和链表都可以随机访问 B. 数组的插入和删除可以 O(1) C. 哈希表没
6、有办法做范围检查 D. 以上说法都不正确答案:B解析: A选项是错误的,因为数组可以直接通过下标得到存储的值因此支持随机;而访问链表是链式存储结构时无法支持随机访问,要访问一个指定位置的元素必须从头开始做指针移动 B选项是正确的,因为数组的插入如果位置在最后面的话可以为O(1),删除的时候,直接通过下标指定要删除哪个即可,所以也可以为O(1) C选项是错误的,因为哈希表支持直接通过关键码得到值其实数组就是一种哈希表下标就是关键码通过下标直接得到值因此哈希表肯定需要做范围检查也有办法做范围检查的 D选项是错误的,这个不用解释啦,哈哈_基于比较的排序的时间复杂度下限是多少?() A. O(n) B
7、. O(n2) C. O(nlogn) D. O(1)答案:C解析:其实大家记住这个结论就好,在当前计算机科学界对于基于比较的排序最快只是O(n*logn),例如快速排序,堆排序,归并排序有两个线程,最初 n=0,一个线程执行 n+; n+; 另一个执行 n+=2; 问,最后可能的 n 值?()A. 1B. 2C. 3D. 4答案:BCD解析:大家要知道 C语言中的 + 和 += 并不是原子操作,而是通过多条微程序组成的,因此 + 和 += 在执行过程中可能被中断的 第一种可能情况:现在假设两个线程没有并行顺序执行的那么结果显然是 4。 第二种可能情况:再假设现在第一个n+ 已经执行完了 但是
8、结果还没有写回内存这个时候 n+=2 已经全部执行完 2 写进了内存结束然后回到n+的写回操作这个时候内存就从2被改回1了,后面再来一次n+ 结果就为2。 第三种可能情况:第n+=2 先读取n的值到寄存器即0入寄存器这个时候被中断 第一个n+开始执行并直到结束内存被改成了1 ,然后 n+=2 继续执行结束后内存变为2 第二个n+再执行结果就是3了 我个人看了网上的这个解析后也觉得,肯定不可能为1了。下面哪些函数调用必须进入内核才能完成?() A. fopen B. exit C. memcpy D. strlen答案:AB解析: fopen是打开文件的函数,文件也可以看成是一个设备,打开一个设
9、备将导致给设备所属的驱动程序发送一个IRP,而与真实硬件相关的驱动程序都运行于内核 exit函数是结束进程的函数,结束进程需要访问PCB(进程控制块)和TCB(线程控制块)等等一些数据结构,而这些数据都存在于内核中 memcpy和strlen我们可以直接不调用任意函数写出来这种函数肯定不会实现在内核的 关于memcpy函数,详情可以查看XX百科的解释(地址是:死锁发生的必要条件?() A. 互斥条件 B. 请求和保持 C. 不可剥夺 D. 循环等待答案:ABCD考点:操作系统,刚刚学,好兴奋这题当时做的,一秒钟都不用瞬间选择了【偷笑】解析:互斥条件,请求和保持,不可剥夺,循环等待,这些都可能导
10、致发生死锁,所以以后大家在做多线程程序时一定要注意了。内存管理中的 LRU 方法是用来管理什么的?()A. 虚拟内存的分配B. 虚拟内存的释放C. 物理内存的分配D. 物理内存的释放答案:AD考点:操作系统解析:今天下午认真看了下课本,温故了下知识,关于这题,得出以下几个解释,详细的我就不说啦,大家自己看书,我大概说下基本的。1.页面调入:是给页面调入内存中,给它分配物理内存2.页面置换,就是将内存中的页面置换出来,放到虚拟内存中,让物理内存空闲出来,让给需要使用的页面。3.LRU:全称是:Least Recently Used(最近最久未使用)置换算法,所以这个算法涉及到了虚拟内存的分配和物
11、理内存的释放。所以答案是AD。求N个数中的最大值和最小值,最小比较次数是多少?A 4n/3B 2n-2C n-1D 3n/2答案:D解析:在一本书上看过,利用分治思想,评论中有LPopo提供的不用分治法实现的代码,在九楼。在此表示感谢。一棵二叉树的先序遍历是 f b a c d e g h,中序遍历是 a b d c e f g h,问后序遍历是什么答案:adecbhgf解析:根据先序遍历和中序遍历,我们可以构建一颗二叉树:在32位little endian机器上运行该程序,得到结果是什么?#include int main()longlong a = 1, b = 2, c = 3; pri
12、ntf(%d %d %d n, a, b, c);return0;A.123B 102C . D 321答案:B解析:因为long long 是8个字节的,%d是4个字节的,溢出覆盖了后面,然后又是小端规则的。【传入参数,由右往左,栈空间内存从高往低,littleendian,栈空间如下:内存高位-00000000000000110000000000000010(c)00000000(b)00000001(a)-内存低位因此printf会按照4bytes取参数. 】来自关于访问,下面哪些是后台绝对不会执行的?A. 本地查查 DNS,是否有 的 ip;B. 通过 cn. 查找 ip;C. 通过
13、com. 查找 ip;D. 浏览器发送 http get请求;E. 服务器回送 xxx.jpg;答案:。不会,我当时蒙的,好像选的是E。解析:不会,自然解析不了。高内聚和低耦合,下面哪个耦合度最高?A. 通过函数参数传递.B. 一个函数修改另外一个函数中的数据;C. 通过全局变量.D. 通过指示器.答案:网上说答案是C,我也不是很清楚。解析: 内聚就是一个模块内各个元素彼此结合的紧密程度,高内聚就是一个模块内各个元素彼此结合的紧密程度高。所谓高内聚是指一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则。 耦合:一个软件结构内不同模块之间互连程度的度量(耦合性也叫块间
14、联系。指软件系统结构中各模块间相互联系紧密程度的一种度量。模块之间联系越紧密,其耦合性就越强,模块的独立性则越差,模块间耦合的高低取决于模块间接口的复杂性,调用的方式以及传递的信息。) 对于低耦合,粗浅的理解是:一个完整的系统,模块与模块之间,尽可能的使其独立存在。也就是说,让每个模块,尽可能的独立完成某个特定的子功能。模块与模块之间的接口,尽量的少而简单。如果某两个模块间的关系比较复杂的话,最好首先考虑进一步的模块划分。这样有利于修改和组合.TCP协议栈的定时器有哪些()A.B.C.D.答案:忘记选项了,网上也找不到,大家知道有考这个知识点就好啦。解析:XX了一下,TCP协议栈的定时器有延时
15、定时器,重传定时器,坚持定时器,保活定时器网卡,交换机,路由器和UDP分别工作网络的哪些层?答案:依次是:物理层,链路层,传输层填空题在一个 big endian 的32位的计算机上,b 的结果是_unsigned int a = 0x1234;char b = *(char*)&a);答案:0解析:unsigned int是 4 个字节,0x1234 的完整表示是 0x 00 00 12 34,因为是 big endian,所以,所以&(取地址) 的话,如果当字节看的话,取到了最左边 00 字节的地址,一定要转换成 char 看的话,值就是 0。一个有800个结点的完全二叉树,问有_个叶子结
16、点?答案:400解析:画图举例子很容易就可以推导出规律,通过这个公式即可计算得400下面get是求一个二维数组元素的函数,请补全.#include #include #define M 3#define N 4intget(int *a, int i, int j) _ / 此处一个空 int main() int aMN = 1,2,3,4,5,6,7,8,9,10,11,12;int v; v = get(a, 2, 1); printf(a21 = %dn, v ); return0; 答案:return *(a+i*N+j);解析:大家注意原型中的指针是int*a,所以必须用二维数组在
17、内存中是一维排布这个知识点来做,直接return*(a+i*N+j);而不是 return *(*(a+i)+j);补全插入排序:#include #include int insert_sort(int *p, int count)int i, j, tmp;if(p = NULL | count 0) return0; /for(i=1; icount; i+) tmp = pi; j = i-1;while(_) / 此处一个空 pj+1 = pj; -j; _; / 此处一个空 return1;int main()int i, a10 = 3, 2, 1, 7, 8, 10, 4, 5
18、, 6, 9; insert_sort(a, 10);for(i=0; i=0 & pjtmp 第二个空:pj+1= tmp;解析:看看数据结构的课本就有啦,呵呵使用 FIFO 管理页面请求,如果分配的物理块 M = 3或是4,请求顺序如下:43244354531515154,问两种情况下页面失效的次数各是_和_?答案:首先感谢LPopo的解答,答案是9和6,考点:操作系统解析:M=3时:一开始是空的,所以4,3,2都页面失效。失效三次,然后4,4,3都有效,5失效一次,4先进来的所以先出去,变为3,2,5,然后4又失效一次,3出去,变为2,5,4,以此类推。就是先进来的先出去。最后加起来一共
19、9次。M=4的也一样。只是能多存一个页。软件可靠性评估的两个指标是_和_?答案:不会。参考网站:Coding Life的专栏:lyj103862095的专栏:XX文库:32 位机上根据下面的代码,问哪些说法是正确的?signed char a = 0xe0;unsigned int b = a;unsigned char c = a;A. a0 & c0 为真 B. a = c 为真 C. b 的十六进制表示是:0xffffffe0 D. 上面都不对分析:坑爹丫,有木有!10 个人 9 个这个恐怕都不敢确定!(敢肯定的要么是高手,要么就是错的!) B me 认为是错的,一个 uchar 和一个
20、 schar 比较,真的就是一个字节在比较吗?C me 认为是对的,将一个 schar 赋值给一个 uint,要不要符号扩展呢?是绝对会还是可能会呢?细节到底是神马?O_OA 貌似比较确定,肯定是错的,肯定?揭露真相:A 确实是错的,B 也是错的,C 是对的,所以 D 也是错的。理由?A 错是因为,a 是负数,c 是正数,即使跟 0 比较要转换到 int(后面暂不区分转换和类型提升,总之就是类型变了),也是一负一正,所以 A 错。B 呢?是说一正一负不会相等,难道是因为这吗?难道不是吗?首先说 a 和 c 的二进制表示一模一样,都是 0xe0,那么比较就不相等?!是的,比较的时候全部转换为 i
21、nt,所以呢,a 还是作为一个负数存在,c 作为一个正数存在,于是就不相等了,所以 B 错。C 肿么就对了?a 是一个 schar,赋值给 uint 的 b,前若干个字节不是补 0 吗?首先 schar 转换为 int,然后 int 转换成 uint,所以最初是符号扩展,然后一个 int 赋值给了 uint,C correct!me 曾经要写一篇关于c的类型以及指针的 blog,不过最后没有完成,不过还是可以参考一下的。下面哪些选项能编译通过?int i;char a10;string f();string g(string &str);A. if(!i)f(); B. g(f(); C. a
22、=a+1; D. g(abc);分析:再次坑爹有木有!(其实 me 比较确信这道题,是坑别人的爹,O_O)A 绝对是正确的,C 绝对是错的,D 基本肯定是错的,那 B 呢?要么 error ,要嚒 warning!如果是 warning 但是没有 error ,这算神马情况呢?B 确实不应该选,至少语义上不该选!f() 返回一个临时量,然后传给 g 函数,而 g 的参数是非 const 引用,是不能引用临时量的!为嘛,如果 g 中修改了传进来的 string,那么会是怎么一回事呢?修改了一个临时量的值?那这意义何在呢?但是如果将 g 的原型修改为 string g(const string&)
23、; 就是可以的,为么可以?访问(只读)临时量就是正确的?那必须的,比如 u 可能想知道 a+b 的结果是多少,然后输出!a+b 的结果就是一个临时量。如果说修改 a+b 的结果,这是神马个逻辑?!真相:C 错是以为 a 是一个地址常量,不可能再被赋值。D 为嘛错呢?abc 的类型可是 const char* 呢,是个常量指针呢!(可以用来初始化 string。)int a10; 问下面哪些不可以表示 a1 的地址?A. a+sizeof(int) B. &a0+1 C. (int*)&a+1 D. (int*)(char*)&a+sizeof(int)分析:奇葩丫!(其实并不奇葩!)腾讯的题目
24、有时候出的的确有水平丫,虽然出的太有水平了分就考不高了。me 想哭丫,想来想去还是在 A 和 B 中选错了,%_%,当时还特意提醒自己来着的,O_Oc+ 中的 sort 如何用来排序 a 数组呢?sort(a, a+N); 或是 sort(a, a+sizeof(a)/sizeof(a0); 当时懵了,实际上 a+1,就是 a1 的地址呢!a 的类型是 int10,a+1 和一个 int* 类型的 +1 效果一样,都表示偏移 1 个元素,所以 A 不能表示。(选错误的!) C 能表示是因为取了首地址作为一个 int* 然后 +1,就是偏移一个元素,所以不选。B 肿么说呢,me 一直一位&a0
25、是一个普普通通的地址,+1 就是 +1个字节,实际上是 +1 个元素!D 也能表示?将 a 的首地址转换为一个 char* 指针,这个时候 +1 是偏移一个 char,也就是一个字节,实际上应该偏移 sizeof(int) 个字节才能到达 a1,所以 D 可以表示(不选)。不多说了。(如果是二维数组是不是会更懵呢,O_O) a可以看做一个const int *, a+是不行的,不能自增。+重载问下面的数据都存放在哪些存储区?int main() char *p = hello,world; return 0;A. . B. . C. 栈和常量区 D. 栈和堆分析:hello,world 是常量
26、,赶脚应该就是 C 吧,应该大家感觉都一样。这里不涉及什么堆的事。假设在一个 32 位 little endian 的机器上运行下面的程序,结果是多少?#include int main() long long a = 1, b = 2, c = 3; printf(%d %d %dn, a, b, c); return 0;A. . B. . C. . D. .分析:貌似问题没有想的那么简单。如果说运行结果,很简单,有人是 1 0 2;有人是 1 2 3。涉及到 little/big endian 和参数入栈的问题,me 表示现在有点无能为力,O_O下面哪些函数调用必须进入内核才能完成?A.
27、 fopen B. exit C. memcpy D. strlen分析:有些无能为力。A 是要打开文件的,貌似设计很多内核操作丫;exit 是退出进程,结束进程,应该也要深入内核。memcpy ,me 一直犹豫用户区的数据拷贝要不要通过内核。strlen me 感觉关系不大。内存管理中的 LRU 方法是用来管理神马的?A. 虚拟内存的分配 B. 虚拟内存的释放 C. 物理内存的分配 D. 物理内存的释放分析:貌似是用来关系物理块的,后面的填空题正好有说,O_O(扫描LRU链表释放最近最少使用的内存)关于DMA 的说法,哪些是错误的?A. DMA,Direct Memory Acess 直接存
28、储器访问,使得不同的速度的硬件设备可以直接通信,不通过 CPU 干预;B. DMA 访问的时候需要从 CPU 那里夺得总线控制权,然后.C. DMA 速度快;D. DMA 不需要中断控制,CPU 管理不要它;允许不同速度的硬件装置来沟通,而不需要依于CPU的大量中断负载在实现DMA传输时,是由DMA控制器直接掌管总线,因此,存在着一个总线控制权转移问题。即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。由此可见,DMA传输方式无需CPU直接控制传输,也没有中断处理方式那样保留现场和恢复现场的过程,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。死锁发生的必要条件?A. 互斥条件 B. 请求和保持 C. 不可剥夺 D. 循环等待分析:ABCD 就是死锁的四个必要条件,操作系统书上貌似说的很明确。有两个线程,最初 n=0,一个线程执行 n+; n
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1