阿里笔试题(二)

1、如果下列的公式成立:78+78=123,则采用的是_______进制表示的。

答案:13

解析:看个位,因为下列选项都是大于8的,8+8=16,而等式右边个位为3,所以13进制,即进了1后剩下3

解方程,7x+8 + 7x + 8 = x^2 +2x + 3 得 x=13

 

2、下列 java 程序输出结果为______。

1
2
3
4
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));

答案:true,true

解析:本题是一个自动拆装箱的考题(自动拆装箱JDK需在1.5上)

1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;

2、两个Integer类型进行“==”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。

3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true

4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。

int a=257;

Integer b=257;

Integer c=257;

Integer b2=57;

Integer c2=57;

System.out.println(a==b);

//System.out.println(a.equals(b));  编译出错,基本型不能调用equals()

System.out.println(b.equals(257.0));

System.out.println(b==c);

System.out.println(b2==c2);

因此上面的代码的结果因此为 true, false, false, true

 

3、下列java程序的输出结果为____。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class Example{
String str=new String("hello");
char[]ch={'a','b'};
public static void main(String args[]){
Example ex=new Example();
ex.change(ex.str,ex.ch);
System.out.print(ex.str+" and ");
System.out.print(ex.ch);
}
public void change(String str,char ch[]){
str="test ok";
ch[0]='c';
}
}

答案:hello and cb

解析:

163542_yCp9_2367826.png

 

4、有关下述Java代码描述正确的选项是____。

1
2
3
4
5
6
7
8
public class TestClass {
private static void testMethod(){
System.out.println("testMethod");
}
public static void main(String[] args) {
((TestClass)null).testMethod();
}
}

 

163558_8cGN_2367826.png

答案:运行正常,输出testMethod

解析:我来总结下大家的分析。

1)此处是类对方法的调用,不是对象对方法的调用。

2)方法是static静态方法,直接使用"类.方法"即可,因为静态方法使用不依赖对象是否被创建。

null可以被强制类型转换成任意类型(不是任意类型对象),于是可以通过它来执行静态方法。

3)非静态的方法用"对象.方法"的方式,必须依赖对象被创建后才能使用,若将testMethod()方法前的static去掉,则会报 空指针异常 。此处也验证了2)的观点

当然,不管是否静态方法,都是已经存在的,只是访问方式不同。

 

5、袋子中分别一叠纸币,其中5元面值的纸币6张,10元面值的纸币5张,20元面值的纸币4张,从袋子中任意取4张纸币,则每种面值至少取到一张的概率为____。

答案:48/91

解析:C(6,1)*C(5,1)*C(4,1)*C(12,1)/C(15,4)=96/91为什么有重复(除以2)?题目中纸币是不相互区分的,这里为了解释给5元纸币编号1,2,3,4,5,6.

假设第一次从6个5元纸币中取到了1号,取完10元,20元后,从剩下的12张中取到了2号5元纸币,则第二次有可能从6个5元纸币中取到了2号,取完10元,20元后,从剩下的12张中取到了1号5元纸币,这样两次都有1,2号纸币,所以要除以2.

 

6、有一个扔骰子得返现的游戏:你扔一个骰子,扔到多少就可以得到和点数相同的返现。例如你扔到3,可以得到3元返现;扔到1,可以得到1元返现。当你扔完第一次骰子,看到点数后,你需要做出如下选择:

 

1、拿这个点数对应的返现,放弃扔第二次骰子;

 

2、再扔一次骰子,但此时你只能拿第二次扔的点数对应的返现。

 

那么,玩一轮这个游戏的期望收益是____元。

答案:4.25

解析:

题目没有明确说明什么时候进行第二次投掷,什么时候放弃第二次投掷,所以我们向着最大期望进行投掷,即第一次为4,5,6,时,不进行第二次投掷,期望为(4+5+6)*(1/6) ;第一次为1,2,3时,可能性为1/2,并进行第二次投掷,期望为(1/2)*(1+2+3+4+5+6)*(1/6);所以最后期望为4.25。

 

7、一个长度为100的循环链表,指针A和指针B都指向了链表中的同一个节点,A以步长为1向前移动,B以步长为3向前移动,一共需要同时移动多少步A和B才能再次指向同一个节点____。

答案:50

解析:A B一快一慢,当二者差一圈时,刚好指向同一节点,3*x-1*x=100   x=50

 

8、某操作系统采用分页存储管理方式,下图给出了进程A的页表结构。如果物理页的大小为512字节,那么进程A逻辑地址为0x0457(十六 进制)的变量存放在____号物理内存页中。

 

进程A页表:

逻辑页    物理页

0            9

1            2

2            4

3            6

4            5

5            8

答案:4

解析:

逻辑页=逻辑地址/页面大小;

0x0457 化为10进制为1111,所以逻辑页号= 1111/512 = 2(取整舍去余数);

逻辑页 = 2,对应的物理页号为4;

 

9、在一个100人的团队活动中,主持人小猿亮出了一幅裙子的照片,大喊:”看出蓝黑色的举手!“,团队中有45人举手,然后小猿又喊:”看出白金色的举手!“,团队中有40人举手。机灵的小猿发现,有人从未举过手,有人举手了两次,两轮举手分出的四类人的数目恰好构成一个等差数列。请问有____人既能看出蓝黑色又能看出白金色。

答案:35

解析:

解析:

x 仅蓝黑色 y 蓝黑色和白色 z 仅白色 k 均没看到

x+y = 40

y+z =45

x+y+z+k =100

(x+y+z+k) – (x+y)-(y+z) = k-y=15=nd, 其中 d 表示等差数列的前后项的差,由于等差数列只有 4 向,因此 n<=3,15=3*5 ,因此 n=3 ,d=5 ,并且等差数列必然为 k 45 40 y ,因此 y=35

 

10、将1,2,3,......,99,100任意排列成一个圈,相邻两数的差的绝对值求和最多为____。

答案:5000

解析:关键不在于排列是(100 1 99 2 98 3 。。。。 52 49 51 50)还是(1,51,2,52,3,53...49,99,50,100)  而在于这个两数之差是要和前后都对比,这样就相当于算了两遍,所以就是2500*2=5000

 

排列:1,100,2,99,3,98.。。。。。。

实际得到的差是这样的   (1-100),(100-2),(2-99),(99-3)。。。。是依次做减法   

相信很多人第一遍会忽略小数减大数那一半 所以才会得到2500那个答案,   而实际答案要全面考虑,得到答案是5000

先放大数组(51~100)围成一圈,再放小数组(1~50)在大数组的每两个数之间,这样能保证相邻两个数的差值相加之后最大。每个数字都参与了2遍运算,所以结果是2 * (大数组之和 - 小数组之和),为了方便运算,变换成2 * (51-1 + 52-2 + 53-3 + 54-4 .... 99-9 + 100-50),也就是2 * 50 *50=5000

 

11、已知二叉树中有45个叶节点,有25个度为1的节点,则二叉树的总结点数为____。

答案:114

解析:二叉树的性质n0=n2+1的推导:所有节点=n0+n1+n2(即度为0+1+2的节点)=2*n2+n1+1(即分支总数+1).

 

12、以下函数中,和其他函数不属于一类的是____。

strcpy

strncpy

snprintf

strcat

strtok

strncat

答案:snprintf

解析:snprintf 在stdio.h头文件中,其他的在string.h头文件中

 

首先,使用场景不同。除了snprintf之外,其他的都是用于两个字符串之间进行比较、拷贝、拼接等操作的,而snprintf最主要是,要把一个用户变量按照一个format打印到字符串中。

其次,函数参数类型不同。除了snprintf之外,其他的都是定长参数,而snprintf是接受变长参数的。

最后,定义位置也不同,除了snprintf位于stdio.h之外,其他的都是string.h中的。

因此,snprintf和其他的一定不是一类的,单从头文件的划分就能看出来。

P.S. glibc的头文件划分绝大多数都很有讲究。

 

13、某单链表有5个元素,设单链表的节点结构为(data,next),5个元素的data依次为(1、2、3、4、5),已知指针q指向节点3,指针p指向节点4,那么下面操作能将链表变为data依次为(1、2、3、5)的是____。(其中temp为节点类型指针,默认指向NULL)

答案:temp = p->next; p->next=temp->next; p->data=temp->data; delete temp;temp=NULL;

解析:这个问题一般会先考虑删除节点p

但答案中没有合适的删除节点p的操作,最接近的选项D应该改为q->next=p->next,且删除p才正确

因此我们考虑第二种思路

把p节点数据域的内容改成下一个节点的内容,由4改成5,再删除p后面那个节点5

选项E和F符合我们的思路

考虑E选项,我们发现前面指针变换都是对的,但是删除节点时发生了错误

因为p->next已经在前面改过了,这样造成的后果就是删除的是节点6而不是节点5

 

14、在1,2,3,.....1000中,有____个数各位乘积为0。

答案:181

解析:

先求乘积不为0的。分一位数A:1-9 9个;两位数AB:9*9=81个,三位数ABC:9*9*9=729

总共9+81+729=819 

乘积为0的个数:1000-819=181

考虑个位为0的数,形如10,20,30...110,120...20,210,220...1000等,也就是为1到100每一个数加上一个零,共100个数,再考虑十位为0的数,101到109,共有9个,101到909共81个数(九个区间,每个区间九个数,即9 * 9 = 81);共100 + 81 = 181。

 

15、 A、B、C、D四人应聘一个程序员职位,此职务的要求条件是:Java熟练;懂数据库开发;会Web开发;有C++经验。谁满足的条件最多,谁就被雇用。(1)把上面四个要求条件两两组合,每个组合都恰有一人满足。同时已知(2)A和Bjava熟练(3)B和C会Web(4)C和D懂数据库(5)D有C++经验那么,被雇用的是____。

答案:B

解析:根据已知条件,列出当前了解的技能掌握情况

Java:A和B

WEB:B和C

数据库:C和D

c++:D和B

再写出六种技能组合,结合已知条件进行推测。

Java Web:B会,所以A肯定不会Web (因为A会Java) 

Java 数据库:

Java c++:

web 数据库:C会,所以B不会数据库(因为B会WEB),D不会WEB(D会数据库)。

数据库 c++:D会,所以C不会 C++(因为C会WEB) 

WEB c++:排除了ACD,只能是B会。

所以能推断出B会三项技能,java web和c++。且只能有一个人会三项技能及以上,否则就不满足"每个组合都恰有一人满足"的条件,故B是会的技能最多的。 

 

16、一个单向链表队列中有一个指针p,现要将指针r插入到p之后,该进行的操作是____。

答案:r->next=p->next;p->next=r

解析:1.单向链表队列中有A、B两个相邻元素

2.有一个指针p指向元素A

由1,2得到

3:p->next=B

 

现在要把r指针指向的S插入到A和B中间,就要把B放到S后面

也就是r->next=B

然后把S放到A的后面

也就是p->next=S

由上述得到

r->next=p->next

p->next=r

 

 

17、使用KMP算法在文本串S中找模式串P是一种常见的方法。假设S=P={xyxyyxxyx},亦即将S对自己进行匹配,匹配过程中正确的next数组是____。

答案:0,1,1,2,3,1,2,2,3

解析:

严版数据结构求 next 的公式:

我们主要观察第二项,存在两种情况:

( 1 )集合为空,若集合为空,则属于公式中的第一或第三种情况(其他情况), j=1 的时候, next[1]=0 ,当 j>1 的时候, next[j]=1。

( 2 )集合不为空,则我们要取的 k ,是集合中 k 的最大值。

K 需要满足两个条件,一是 1<k<j ,二是后面那个。

--------------------------------------------------------

对于前面这个,不用多说,对于后面这个,如果只看形式化的公式,估计比较难理解其意义。通过阮老师的博文(http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E2%80%93Pratt_algorithm.html),不难理解,后面这个表达式的意义就是所有前缀与所有后缀中,前缀与后缀相同的情况,那么,这个 k 的取值就是前缀与后缀相等时,字符串的长度加上 1 。

-------------------------------------------------------

先以严老师书上的例子:

求模式串 abaabcac 的 next 数组

当 j=1 时, next[1]=0 ,直接是公式的第一种情况

当 j=2 时,因为第二种情况要保证集合不为空且 1<k<j ,那么, j=2 时,集合为空,所以不符合第二种情况,因此,属于其他情况,即next[2]=1

当 j=3 时, k 要小于 j ,所以,我们要在模式串找长度小于 j 的前面全部串的前缀与后缀相同时的最大长度,也就是在模式串中找到前两位 ab ,来找他们最长的前缀与后缀及长度,可以发现,他们没有相同的前缀与后缀,因此,长度为 0 ,而 k 等于长度加 1 ,所以next[3]=1

当 j=4 时,在 aba 中找前缀与后缀的相同时的最大长度,可以求出最大长度Max为 1 ,所以 next[4]=2

当 j=5 时,在 abaa 中找,Max为 1 ,所以 next[5]=2

当 j=6 时,在 abaab 中找,Max为 2 ,所以 next[6]=3

当 j=7 时,在 abaabc 中找,Max为 0 ,所以 next[7]=1

当 j=8 时,在 abaabca 中找,Max为 1 ,所以 next[8]=2

 

之所以要找前缀与后缀,是因为我们在比较的时候,避免做多余的工作,即每次遇到主串和模式串不等时,都把模式串直接从头开始比。

-------------------------------------------------------------------

以模式串为 xyxyyxxyx 为例,求 next

当 j=1 , next[1]=0

当 j=2 , next[2]=1

当 j=3 ,在 xy 中找前缀与后缀,最大长度 max 为 0 , next[3]=1

当 j=4 ,在 xyx 中找, Max 为 1 , next[4]=2

当 j=5 ,在 xyxy 中找, Max 为 2 , next[5]=3

当 j=6 ,在 xyxyy 中找, Max 为 0 , next[6]=1

当 j=7 ,在 xyxyyx 中找, Max 为 1 , next[7]=2

当 j=8 ,在 xyxyyxx 中找, Max 为 1 , next[8]=2

当 j=9 ,在 xyxyyxxy 中找, Max 为 2 , next[9]=3

 

 

18、A为整数数组, N为A的数组长度,请问执行以下代码,最坏情况下的时间复杂度为____。

1
2
3
4
5
6
7
8
9
10
11
void fun(int A[], int n) {
for (int i = n - 1; i >= 1; i--) {
for (int j = 0; j < i; j++) {
if (A[j] > A[j+1]) {
int tmp = A[j + 1];
A[j + 1] = A[j];
A[j] = tmp;
}
}
}
}

答案:O(N^2)

解析:冒泡排序法,最坏情况为(n-1)+(n-2)+……+1=n(n-1)/2   所以复杂度是N^2

 

 

19、牛客某程序猿小杨每天接老婆下班回家。小杨在6点准时下班从公司开车出发,由于路上可能存在的堵车情况,小杨到老婆公司门口的时间点均匀的分布在6点20到6点30之间。老婆根据小杨的下班时间做了估计,到公司门口的时间点均匀的分布在6点25到6点30之间,如果小杨比老婆晚到公司门口将会挨骂,那么小杨被骂的概率是____。

答案:1/4

解析:

6.20-6.25到达的概率为1/2不会挨骂

6.25-6.30小杨先到概率为1/2,不挨骂1/2*1/2

剩下1/4挨骂

 

20、将整数数组(7-6-3-5-4-1-2)按照堆排序的方式原地进行升序排列,请问在整个排序过程中,元素3的数组下标发生过____次改变。

答案:2

解析:

按整数数组的最大堆定义,每次调整完后根结点的元素与最后个元素交换,继续下次调整,直到所有的结点调整完毕。

原数组为 7 6 3 5 4 1 2 满足最大堆定义,直接交换根节点元素

               2 6 3 5 4 1 7,交换完毕

               6 5 3 2 4 1 7,调整完毕

               1 5 3 2 4 6 7,交换完毕

               5 4 3 2 1 6 7,调整完毕

               1 4 3 2 5 6 7,交换完毕

               4 2 3 1 5 6 7,调整完毕

               1 2 3 4 5 6 7,交换完毕,此时虽然已有序,但仍需进行最大堆调整,因为最大堆算法时间复杂度为nlog2n,会进行继续搜索调整

               3 2 1 4 5 6 7,调整完毕,移动一次

               1 2 3 4 5 6 7,交换完毕,移动两次

               2 1 3 4 5 6 7,调整完毕

               1 2 3 4 5 6 7,交换完毕

 

以为是一趟排序,所以选的0,如果是整个排序过程,3应该只移动了2次,就是最后3放入堆顶1次(下标从2变为0),然后跟当前堆的最后一个元素交换1次(下标从0变为2),一共2次。

 

 

 

 

 

转载于:https://my.oschina.net/hxflar1314520/blog/1305399

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值