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
解析:
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(); } } |
答案:运行正常,输出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次。