达内LOGO和北京达内网址达内科技培训项目:Java培训 3G培训 Android培训 软件测试培训北京达内服务电话
C++培训
阿里巴巴2012c++笔试题

   1.BMP格式图像,图像深度为24位,一个512*1024的点阵图像所占空间是多少?

    [html]

    答:(24/8)B*512*1024=1.5M

    2.十进制数字-3转换为3进制的补码结果是多少?

    [cpp] view plaincopy

    答:-3可以表示为:符号位负号可表示为1,   3为十进制,可以表示为13,转换成三进制为110(符号位不变,3转变为10),补码的计算是源码的反码加1,110的反码为112(最高位为符号位不变,10反码为12(因为三进制中1的反码为1,2的反码为0,0 的反码为2)),反码加1后就是120

    3.两个进程同时执行以下一段代码,其中不可能的结果是:

    [html]

    代码如下:

    A=5;

    A=A+1 ;

    printf("%d",A);

    A 5,6  B 6,5     C 6,7  D  7,6

    答:B,D,选项记不太清楚了,答案也是不太确定,望大牛指点。

    4.pid_t pid=fork();

    if(pid<0)

    cout《-1《endl;

    else if(pid==0)

    cout《0《endl;

    else

    cout《1《endl;

    不可能的答案是:

    A  0   B 1  C 1,0 D 0,1

    [cpp] view plaincopy

    答案待定。C,D应该是可能的。

    5 忘了

    6.   6双不同的袜子,取四只,恰有一双袜子的情况有几种?

    [cpp]

    答: 6*(C(10,2)-5)=240. 其中C(10,2)是从10只袜子选2只的种类。

    7. 32位及其能否处理超过4G的内存?

    [cpp]

    不能,因为32为编制最大是4G,即便是所有的内存都存放地址,而不存放数据,也只能放4G的内存。

    8.树有时候比哈希快?

    不太清楚

    9.简述一下LRU算法

    [cpp]

    什么是LRU算法? LRU是Least Recently Used的缩写,即最近最少使用页面置换算法,是为虚拟页式存储管理服务的。关于操作系统的内存管理,如何节省利用容量不大的内存为最多的进程提供资源,一直是研究的重要方向。而内存的虚拟存储管理,是现在最通用,最成功的方式-- 在内存有限的情况下,扩展一部分外存作为虚拟内存,真正的内存只存储当前运行时所用得到信息。这无疑极大地扩充了内存的功能,极大地提高了计算机的并发度。虚拟页式存储管理,则是将进程所需空间划分为多个页面,内存中只存放当前所需页面,其余页面放入外存的管理方式。   然而,有利就有弊,虚拟页式存储管理减少了进程所需的内存空间,却也带来了运行时间变长这一缺点:进程运行过程中,不可避免地要把在外存中存放的一些信息和内存中已有的进行交换,由于外存的低速,这一步骤所花费的时间不可忽略。因而,采取尽量好的算法以减少读取外存的次数,也是相当有意义的事情。   对于虚拟页式存储,内外存信息的替换是以页面为单位进行的--当需要一个放在外存的页面时,把它调入内存,同时为了保持原有空间的大小,还要把一个内存中页面调出至外存。自然,这种调动越少,进程执行的效率也就越高。那么,把哪个页面调出去可以达到调动尽量少的目的?我们需要一个算法。   自然,达到这样一种情形的算法是最理想的了--每次调换出的页面是所有内存页面中最迟将被使用的--这可以最大限度的推迟页面调换,这种算法,被称为理想页面置换算法。可惜的是,这种算法是无法实现的。编辑本段差距  为了尽量减少与理想算法的差距,产生了各种精妙的算法,最近最少使用页面置换算法便是其中一个。LRU算法的提出,是基于这样一个事实:在前面几条指令中使用频繁的页面很可能在后面的几条指令中频繁使用。反过来说,已经很久没有使用的页面很可能在未来较长的一段时间内不会被用到。这个,就是着名的局部性原理 --比内存速度还要快的cache,也是基于同样的原理运行的。因此,我们只需要在每次调换时,找到最近最少使用的那个页面调出内存。这就是LRU算法的全部内容。

    10.有甲,乙两个箱子,甲箱子中方了800个红球,200个蓝球,乙中放了200个红球,800个蓝球(后面的忘了,想起来了再写)

    11.n个无序整数,已知第i个数在排好序的序列中的位置为j,满足|i-j|<=K,请设计一种排序算法,对该序列进行排序。注:算法时间复杂度为O(nlgn)的得0分,复杂度为O(nk)

    的得两分,总分是20分。

    [cpp]

    答:由以上条件判断最小的数字一定在前k个中,于是可以讲前k个数建立一个最小堆,然后把根元素取出,该根元素就是最小数,然后将第k+1个数放入堆中,因为第二小的数字肯定在下标为1到k+1的位置范围内,所以调整最小堆之后,根元素就是第二小元素,取出该元素,将第k+2个元素放入堆中,……以此类推,按照元素从堆中取出的顺序就是已经排好序的序列。该算法时间复杂度为O(nlgk),确切的说是(n-k)lgk,

    12.有一个字符串排列 a,b,c,d,aa,ba,ca,da,ab,bb,cb,db,ac,bc,cc,dc,ad,bd,cd,dd……

    编程实现:1.ababab是第几个字符串?

    2,第78个字符串是什么?

    3.第n个字符串是什么?

    [cpp]

    初看起来比较抽象,但是我们如果把每一个字符串前后颠倒,问题就明朗多了,加入我们做如下映射:a---1, b---2,c---3,d---4,那么以上的每一个字符串前后颠倒后再做一下数字映射就变成了:1,2,3,4,11,12,13,14,21,22,23,24,……是不是很熟悉了,很像四进制编码吧!只是把0换成了4,如果求某一字符串的位置,则做数字映射之后的计算就简单多了,比如ababab翻转后为bababa,转化为数字后就是:212121,位置就是(((((2*4+1)*4)+2)*4+1)*4+2)*4+1;就是做一个特殊四进制到十进制的转换。有了这个思路下面的题目就好做多了。