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

  • 相关阅读:
    JAVA中数据类型转换
    PADS故障解决
    KEIL4.12中添加ULINK2的支持
    身份证号码规则
    用19种编程语言写Hello World
    30年的Hello world
    Java Annotation手册
    线控耳机原理图
    破解EXCEL2007的密码
    [野狐行][内存辅助][二重门更新中][2016/6/1]
  • 原文地址:https://www.cnblogs.com/dingshilei/p/4125726.html
Copyright © 2020-2023  润新知