阿里巴巴2016校招笔试题(含答案、解析)

来源:互联网 发布:商家服务规范 淘宝 编辑:程序博客网 时间:2024/05/21 11:08

3、将1,2,3,……,99,100任意排列成一个圈,相邻两数的差的绝对值求和最多为( )
A:100
B:198
C:200
D:500
E:2500
F:5000
答案:F

4、如果下列的公式成立:84*148=B6A8。则采用的是( )进制表示的。
A:15
B:11
C:12
D:14
E:16
F:以上都不对
答案:C

解析:
1、常规做法:假定数值是x进制的,则写出等式:(8x+4)(x2+4x+8)=11x3+6x2+10x+8,化简得到(3x2+6x+2)(x-12)=0,则x的非负整数解为x=12。
2、“启发式”做法:在十进制体系下,左侧个位乘积4*8=32;右侧个位为8,差32-8=24,从而进制必然是24的约数。只有C选项12是24的约数。

5、在1,2,3,……1000中,有( )个数各位乘积为0。
A:100
B:101
C:172
D:181
E:190
F:191
答案:D 181

解析:题目本质是求含有数字0的数。分三种情况讨论:
1、一位数中,没有数字为0;
2、两位数中,只有整十的数含有数字0,共9个;
3、三位数中,分为只有1个0和两个0两种情况:
3.1 若只有个位为0,则十位和百位各有9种取法,共81种取法;
3.2 若只有十位为0,则个位和百位各有9种取法,共81种取法;
3.3 若个位和十位都为0,则百位有9种取法。
4、1000本身是1种有效取法。
综上,共0 (一位数)+ 9(两位数) + 81+81+9(三位数) + 1(四位数) = 9+171+1=181种。

6、有一个单向链表队列中有一个A、B两个相邻元素,有一个指针p指向元素A,现将一个指针r指向的S元素要插入到A和B之间,该进行操作( )
A:p->next=p->next->next
B: r->next=p;p->next=r->next
C: r->next=p->next;p->next=r
D: r=p->next;p->next=r->next
E: r->next=p;p->next=r
F: p=p->next->next
答案:C

解析:基本的指针操作。需要将p的后继赋值给r的后继,然后将p的后继指向r即可。

9、一个长度为99的循环链表,指针A和指针B都指向了链表中的同一个节点,A以步长为1向前移动,B以步长为3向前移动,一共需要同时移动多少步A和B才能再次指向同一个节点( )。
A:99
B:100
C:101
D:49
E:50
F:51
答案:A

解析:假定经过n步A、B再次相遇。则A经过的结点为n,B经过的结点为3n;此刻B必然比A多经过了整数倍的链表长度(圈的长度),假定经过了i倍的链表长度,则有3n-n=99i,即2n=99i;满足该等式的最小整数位i=2,n=99。即A经过了99个结点,B经过了297个结点,二者再次相遇。

10、考虑以下二分查找的代码:

include<stdio.h>int bsearch(int array[], int n, int v){int left, right, middle;left = 0, right = n-1;while(left <= right){    middle = left + (right - left)/2;    if (array[middle] > v)        right = middle;    else if (array[middle] < v)        left = middle;    else        return middle;}return -1;}

对于输入array为:{2, 6, 8, 10, 13, 25, 36, 45, 53, 76, 88, 100, 127},n = 13, v = 127时,运行bsearch函数,while循环调用的次数为( )
A:1
B:2
C:3
D:4
E:5
F:无法退出
答案:F

解析:
由于在执行if(array[middle] < v)成功后,将left赋值为middle,若此时left和right仅相差1,则middle仍然会等于left,从而导致折半查找代码无法退出。而查找127恰恰发生了这种死机的情况。事实上,上述代码如果正常运行,应该把left = middle换成left = middle + 1,形成如下的正确代码。(此外,right = middle其实也可以换成right = middle-1)。

int bsearch(int array[], int n, int v){int left, right, middle;left = 0, right = n-1;while(left <= right){    middle = left + (right - left)/2;    if (array[middle] > v)        right = middle;    else if (array[middle] < v)        left = middle + 1;    else        return middle;}return -1;}

11、袋子中分别一叠纸币,其中5元面值的纸币6张,10元面值的纸币5张,20元面值的纸币4张,从袋子中任意取4张纸币,则每种面值至少取到一张的概率为( )
A:8/91
B: 25/91
C: 48/91
D: 53/91
E: 60/91
F: 63/91
答案:C

12、商品推荐场景中过于聚焦的商品推荐往往会损害用户的购物体验,在有些场景中,系统会通过一定程度的随机性给用户带来发现的惊喜感。假设在某推荐场景中,经计算A和B两个商品与当前访问用户的匹配度分别为0.8分和0.2分,系统将随机为A生成一个均匀分布于0到0.8的最终得分,为B生成一个均匀分布于0到0.2的最终得分,那么最终B的分数大于A的分数的概率为( )
A:1/16
B:1/8
C:3/16
D:3/8
E:1/4
F:1/3
答案:B

解析:A=B的直线上方区域,即为B>A的情况。S蓝色=0.02 S矩形=0.16,
从而,p=0.02/0.16=0.125

13、有关下述Java代码描述正确的选项是( )

public class TestClass {private static void testMethod() {    System.out.println("testMethod");}public static void main(String[] args) {    ((TestClass)null).testMethod();}}

A:编译不通过
B:编译通过,运行异常,报NullPointerException
C:编译通过,运行异常,报lllegalArgumentException
D:编译通过,运行异常,报NoSuchMethodException
E:编译通过,运行异常,报Exception
F:运行正常,输出testMethod
答案:F

解析:testMethod()是静态方法,不属于任何对象,所以其调用与类是否实例化没有关系。((TestClass)null).testMethod()在调用时编译器检测到该方法为静态方法,相当于TestClass.testMethod(),于是便正常执行。

14、有一个类B继承子类,他们数据成员如下:

class A{...private:  const int a;};class B : public A{...private:  int a;public:  const int b;  A c;  static const char* d;  A& e;};

则这些成员变量一定要通过A或者B的构造函数初始化列表来初始化的是( )
A:b c
B: b c e
C: b c d e
D: c e
答案:B

解析:常量必须在初始化列表中初始化,否则,由于常量无法修改,在其他任何地方做为左值出现都将报错;A::a、B::b即为此类型;其中,A::a在类B中由B::a覆盖,但B::c必须经过类A的初始化列表才能初始化。引用类型必须初始化,因此也只能在初始化列表中初始化;A& e即为此类型。

15、A、B、C、D四人应聘一个程序员职位,此职务的要求条件是:Java熟练;懂数据库开发;会web开发;有C++经验。谁满足的条件最多,谁就被雇用。
把上面四个要求条件两两组合,每个组合都恰有一人满足。同时已知
A和B Java熟练
B和C会web
C和D懂数据库
D有C++经验
那么,被雇用的是( )
A:A
B: B
C: C
D: D
E:四人机会均等
F:以上均错
答案:B

16、从1,2,3,……,99,2015里任意选择一部分数(可能为0个数),这部分数按位异或起来的期望值是( )
A:512
B:1007
C:1008
D:2015/2
E:1024
F:2047/2
答案:F

17、以下函数中,和其他函数不属于一类的是( )
A:strcpy
B:strcpy
C:snprintf
D:strcat
E:strtok
F:strncat
答案:C

解析:
char strcpy(char dest, const char *src)是把src指向的字符串复制到以dest指向的地址空间中;int snprintf(char *str, size_t size, const char *format, …)是按照format格式化成字符串,然后将其复制到str中;char *strcat(char *dest,char *src)是把src所指字符串添加到dest结尾处;char *strtok(char s[], const char *delim)是将字符串s按照delim制定的分隔符分解为一组字符串。char *strncat(char *dest,char *src,int n)把src所指字符串的前n个字符添加到dest结尾处。

文章来自于 http://ask.julyedu.com/question/6951

0 0
原创粉丝点击