详细解答:
一、选择题
1、D 进程拥有独立的地址空间,A错;多进程中父进程与子进程互不会影响,B错;多线程和多进程都会引起死锁,一般说起死锁指的都是进程间的死锁,C错。
2、C 关于索引的相关知识点,不仅笔试喜欢考,面试也喜欢问,务必重视:http://www.ituring.com.cn/article/986
3、A 至少两人生肖相同P(A)=1-12*11*10*9/12^4=41/96
4、C 只有一个员工说的是正确的,即为小侠,所以共500-1=499个小仙。
5、B A类网络的IP地址范围为1.0.0.1-127.255.255.254;B类网络的IP地址范围为:128.1.0.1-191.255.255.254;C类网络的IP地址范围为:192.0.1.1-223.255.255.254。
6、A 六进制转化十进制计算,即:12->8,5->5,104->40 ==> 8*5=40.
7、C ABCDE依次入栈再出栈,A对;ABCDE直接过,D对;ABC入栈,DE直接过,ABC出栈,B对。
8、B 以单词为例,语法分析说白了就是将字符串识别成单词。
9、D 前7个得2红球,后3得1红球,即C(2,7)*C(1,3)/C(3,10) = 21/40.
10、A 先建最大/最小堆,故堆排序对初始排列顺序无影响,复杂度均为O(nlogn).
二、简答题
1、要求时间复杂度为O(n),即要求扫描一次数组得出最大值,想到要用空间换时间的动态规划思路,在扫描数组时新建一对应数组,存放相应的最大值,扫描结束后返回最大值即可。
public static int getMaxSeq(int[] a){ //最大连续队列 int[] sum = new int[a.length]; sum[0]=a[0]; int max = a[0]; for(int i=1;i<a.length;i++){ sum[i]=(sum[i-1]+a[i]>a[i])?sum[i-1]+a[i]:a[i]; //判断前一项是否为负值,存放最大值 max = max>sum[i]?max:sum[i]; //max记录最大值 } return max; }
2、优品的概率P(优)=30%*80%+70%*60% = 66%
优品中是A家的概率P(A|优)=P(A,优)/P(优) = 30%*80%/66% = 4/11.
3、(求简化思路)我的思想方案:
(1)、定义快慢指针,切割后半段链表。
(2)、后半段链表反转。
(3)、交叉拼接前半段和后半段链表。
public static Node linkedListArrange(Node head){ if(head ==null) return null; //快慢指针寻找中间节点 Node first = head; Node second = head; while(second.next!=null){ second = second.next; first = first.next; if(second.next!=null){//null.next报错,故要分开 second = second.next; } } //截取后半段链表 second = first.next; first.next = null; //反转后半段链表 Node cur = second; Node rhead = null; while(cur!=null){ Node front = cur; cur = cur.next; front.next = rhead; rhead = front; } //拼接两段链表 Node nhead = head; while(nhead!=null&&rhead!=null){ Node temp = nhead.next; Node rtemp = rhead.next; nhead.next = rhead; rhead.next = temp; nhead = temp; rhead = rtemp; } if(rhead!=null) //前后半段一样长的处理 nhead.next = rhead; return head; }
4、字符串反转问题,可以先将字符串按空格切割,再倒叙输出。
public static String reverseString(String s) { if(s==null) return null; String[] a = s.split(" "); StringBuffer sb = new StringBuffer(); for(int i=a.length-1;i>=0;i--){ sb.append(a[i]+" "); } return sb.toString().trim(); }
二、简答题
1、最短时间方案(并不是保安来回运人):
保+攻:60s
保回:20s
小+客:240s
攻回:60s
保+产:120s
保回:20s
保+攻:60s
总计:580s
2、一天总共有 3600*24 = 86400秒。所以可定义一个长度为86400的整数数组int delta[86400](每个整数对应这一秒的人数变化值,可能为正也可能为负),开始时将数组元素都初始化为0。然后依次读入每个用户的登录时间和退出时间,将与登录时间对应的整数值加1,将与退出时间对应的整数值减1。这样处理一遍后数组中存储了每秒中的人数变化情况。再定义另外一个长度为86400的整数数组int online_num[86400](每个整数对应这一秒的论坛在线人数),假设一天开始时论坛在线人数为0,则第1秒的人数online_num[0] = delta[0]。第n+1秒的人数online_num[n] = online_num[n-1] + delta[n]。这样我们就获得了一天中任意时间的在线人数。