2015蘑菇街校招笔试详解

详细解答:

一、选择题

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]。这样我们就获得了一天中任意时间的在线人数。

 

posted @ 2014-12-05 15:41  百思求解  Views(1871)  Comments(2Edit  收藏  举报