2014年阿里巴巴校招笔试(9月22号)题目

以下答案均为个人理解,如有错误还望指正.
题目来自:http://ilovers.sinaapp.com/content/2014%E5%B9%B4%E9%98%BF%E9%87%8C%E5%B7%B4%E5%B7%B4%E6%A0%A1%E6%8B%9B%E7%AC%94%E8%AF%959%E6%9C%8822%E5%8F%B7%E9%A2%98%E7%9B%AE

1. 现在计算机中整数采用的编码方式:
A. 原码 B. 反码 C. Unicode 码 D. 补码
答案:
1.计算机中整数一般采用补码进行表示,这样整数和负数就可以统一表示了.
2.整数的补码是他本身,负数的补码是符号位不变,其他各位取反.
3.以32位整数为例:
     0的补码是0,
     -1的补码是0xFFFFFFFE,
     最小的数是:0x80000000 即:-2147483648
     最大的数是:0x7FFFFFFF 即:-2147483647
为什么最小负数比最大整数绝对值差1?
因为负数整数各有2^31个,而0属于整数,这样整数就少了一个.

2. 下面程序的运行结果:

#include <iostream>
using namespace std;

void test(char c, char *d)
{
    ++c;
    ++*d;
    cout << c << *d;
}
int main()
{
     char a='A', b = 'a';
     test(b, &a);
     cout << a << b;
    
    return 0;
}
A. ... B. ... C. bBBa D. ...

答案: 前置++ *是同优先级,从右向左计算.后置++比他们优先级都高.
     优先级为1:() [] 后置++ -> .  从左向右计算
     优先级为2:* & ! ~ 前置++    从右向左计算
这样:++*d 为先解引用再++;即得到'B'.

3. 下面的说法那个正确:

#define NUMA 10000000
#define NUMB 1000
int a[NUMA], b[NUMB];

void pa()
{
    int i, j;
    for(i = 0; i < NUMB; ++i)
        for(j = 0; j < NUMA; ++j)
            ++a[j];
}

void pb()
{
    int i, j;
    for(i = 0; i < NUMA; ++i)
        for(j = 0; j < NUMB; ++j)
            ++b[j];
}
A. pa 和 pb 运行的一样快 B. pa 比 pb 快 C. pb 比 pa 快 D. 无法判断

答案:pb比pa快
考察程序的局部性原理,从理论上来说是一样快的,但是利用了cache,而cache有大小,所以只有当比cache小,且越大越好.
呈现这种情况:


4. 10 个小球中只有一个红球,现在有放回地抽取一个小球,问至到第 n 次才取到 k 个红球 (k ≤ n) 的概率是多少 ?


解释:直到第n次才取到k个红球,所以第n次取到红球,对于前n-1次其中有k-1次取到红球,n-k次取到非红球,所以是以上答案.

5. 某指令流水线由 5 段组成,各段所需要的时间分别是:t、3t、t、2t 和 t 。问如果连续执行 10 条指令,则吞吐率是多少 ?
A. 0.1428/t B. 0.2041/t C. 0.2857/t D. 0.3333/t
答案:c

原因:假设一个四段流水线,取指段的时间为t,译码段的时间为t,取数段的时间为3t,执行段的时间为t。流水线示意图如下:


    为了便于计算假设取指和译码段总是连续执行的。流水线执行n条指令时其执行过程的时空图如下图所示:

 

 

    从图中不难看出,第一条指令的执行时间是6t;第二条指令在执行时停顿了两个周期,第二条指令的完成时间比第一条指令的完成时间晚3t;第三条、第四条......第n条与此相同。

    因此,该流水线执行n条指令的时间就是:6t+(n-1)3t

    流水线的实际吞吐率就是:n/6t+(n-1)3t

 

流水线时间计算公式:一条指令所需时间+(指令条数-1)*时间最长的指令的一段 // 6t+(n-1)3t

吞吐率公式:指令条数 除以 流水线时间 // n/(6t+(n-1)3t)


6. 现有两道四个选项的火星文单选题,你已经至少答对一题了,那么你两题都对的概率是多少 ?

A. 1/3 B. 1/4 C. 1/7 D. 1/8


7. 以下是一个 tree 的遍历算法,queue 是一个 FIFO 队列。参考下面的 tree ,程序输出结果是神马。
queue.push(tree.root);
while(true){
    node = queue.pop();
    output(node.value);    // 输出结点对应的数字
    if(null = node)
        break;
    for(child_node in node.children){
        queue.push(child_node);
    }
}


答案:c

8. 堆排序的时间复杂度是多少 ? 堆排序建堆的时间复杂度是多少 ?

A. O(n2) O(n logn) B. O(n) O(nlogn) C. O(nlogn) O(n) D. O(nlogn) O(nlogn)
答案:D

9. 字符串 "alibaba" 的二进制哈夫曼编码有多少位 ?

A. 11 B.12 C. 13 D. 14

答案:C 13

10. 结点按中序遍历为 xyz 的二叉树有多少种可能 ?

A. 1 B.2 C.3 D.4 E. 5
答案:E:5种

11. 500 张纸牌整齐排成一排,按顺序编号 1、2、3、4、...、499、500,第一次拿走所有奇数位置上的纸牌,第二次再拿走剩下纸牌中的所有奇数位置上的纸牌,以此类推操作下去,问最后剩下的纸牌的编号是多少 ?

A. 128 B. 250 C. 256 D. 500
答案:第一次剩下2的倍数,第二次剩下4的倍数...当剩下最后一张牌的时候,剩下一定是2的整数次幂,比500小且最大.所以为256

12. 一直矩阵 Ak = (aij)rk × rk+1,k = 1, 2, 3, 4, 5, 6 ;r1 = 5,r2 = 10,r3 = 3,r4 = 8,r5 = 5,r6 = 20,r7 = 6,问矩阵链乘 A1 × A2 × A3 × A4 × A5 × A6 的最佳求积次数是多少 ?

A. 2010 B. 2100 C. 2500 D. 2525
答案:动态规划:
#include <iostream>
using namespace std;

int matrixProtity ( int * a, const int niSize)
{
    int ** m = new int *[ niSize];
    for ( int i=0; i< niSize;++ i ){
        m [i ]= new int [ niSize];
    }
    for ( int i=0; i< niSize; ++ i ){
        m [i ][ i]=0;
    }
    int max=0;
    for ( int step=1; step <niSize -1; ++ step ){
        for ( int i=1; i+ step< niSize ; ++i ){
            m [i ][ i+ step] = m [i +1][ i+ step]+ a[ i-1]* a[ i]* a[ i+ step];
            for ( int j= i+1; j< i+ step; ++ j ){
                max = m [ i][ j]+ m[ j+1][ i+ step]+ a [i -1]* a[ j]* a[ i+ step];
                m [i ][ i+ step] = m [i ][ i+ step]< max ? m [ i][ i+ step]: max;
            }
        }
    }
    max = m[1][6];
    for ( int i=0; i< niSize;++ i ){
       delete []m [ i];
    }
    delete [] m ;
    return max ;
}
int main ()
{
    int a[]={5,10,3,8,5,20,6};
   //  int b[]={30,35,15,5,10,20,25};
    //cout<< matrixProtity (b ,7)<< endl;
    cout<< matrixProtity (a ,7);
    return 0;
}


13. 有多少个 2012 位的数,这些数的任意两个相邻数位依序构成的两位数均能被 17 或 23 整除 ?

A. 3 B. 5. C. 7 D. 9

能被23整除的两位数:23,46,69,92
能被17整除的两位数:17,34,51,68,85

2012除以5余2;
如果一个数任意相邻两位被17或者23整除,那么一定是一个循环外加一个尾部.
从图(带有一点自动机的味道)中可以看出这个循环只有一个,我们分别从数字2,3,4,6,9,开始,看一看一共有多少种.
2:2,3:1,4:2,6:2,9:2,一共9种.

14. 关于 linux 的进程,下面说法不正确的是:

A. 僵尸进程会被 init 进程接管,不会造成资源浪费;

B. 孤儿进程的父进程在它之前退出,会被 init 进程接管,不会造成资源浪费;

C. 进程是资源管理的最小单位,而线程是程序执行的最小单位。Linux 下的线程本质上用进程实现;

D. 子进程如果对资源只是进行读操作,那么完全和父进程共享物理地址空间。
答案:
僵尸进程:父进程没有结束,但是子进程已经结束.
孤儿进程:父进程结束,子进程还没有结束.
僵尸进程不会被init进程接收,只有孤儿进程才会被init进程接收.

15. 一个数据表有 10000 个元素,如果仅要求求出其中最大的 10 个元素,采用什么算法比较节省时间 ?

A. 堆排序 B. 希尔排序 C. 快速排序 D. 直接选择排序
答案:堆排序

16. 一棵二叉树具有 8 个度为 2 的结点,5 个度为 1 的结点,则度为 0 的结点个数有多少个 ?

A. ... B. 9 C. 11. D. 不确定

什么是度:节点的分支数
对于度只有一个的节点可以直接插入度为2的节点和度为1的节点之间.
所以我们只用考虑度为2的节点就可以了.度为2的节点一共有n个,若把这n个节点构造程一棵完全二叉树则可以有(n+1)/2个叶子节点.这样每个叶子节点可以继续接两个节点,使其满足度为2.我们需要另外考虑度为2的节点为奇数的时候会造成一个节点的度为1,所以此时在加上一个节点即可.综上我们可以得出结论:度为0的节点和二叉树中度为1的节点个数无关,只与度为2的节点个数有关,且关系为:(n+1)/2*2,当n为偶数时候+1,即可得出n+1的结论.(n为度为2的节点个数)

这是度为2的节点个数:8个.需要9个叶子节点(度为0的节点).

17. 被除数是二进制数 110110,除数是二进制数 111,则余数是多少 ?

A. ... B. 101 C. 110 D. ...
答案:c

18. 对于下面的问题,不能使用栈 stack 来解决的是 ?

A. 数学表达式转换为后缀形式

B. 实现递归算法

C. 编程语言的递归调用

D. 操作系统分配资源( 如 CPU)
答案:D(排除法)

19. 甲盒中有 200 个螺杆,其中有 160 个 A 型螺杆;乙盒中有 240 个螺母,其中有 180 个 A 型的。现从甲乙两盒中各任取一个,则能配成 A 型螺栓的概率为多少?

A. 1/20 B. 15/16 C. 3/5 D. 19/20
答案:c

20. 有 A 和 B 两路公交车,平均发车时间间隔为 5 分钟和 10 分钟。某乘客在站点 S 可以任意选择两者之一乘坐,假定 A 和 B 到达 S 的时刻无法确定,那么该乘客的平均等待时间是多少 ?

A 1 分钟 20 秒 B. 1 分钟 40 秒 C. 2 分钟 30 秒 D. 3 分钟 20 秒
答案:c

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值