2015PPTV校招笔试详解

详细解答:

一、选择题

1、A   至少摸出2黑球=2黑球(5*3/56)+3黑球(1/56)=2/7.

2、B   log2(32)=5。PS:若是长度大于32,则最多比较次数为6.

3、D   后缀表达式又称逆波兰表达式,特征是运算符在运算对象之后,排序ABC选项。也可以利用栈来将中缀表达式转换为后缀表达式。http://blog.csdn.net/mvpsendoh/article/details/6440559

4、C    节点数n<=2k-1(完全二叉树)=〉k>=log2(n+1)=〉k最小为11.

5、A     B选项实现方案:a,b,c依次入栈,d,e直接过,a,b,c出栈。C选项实现方案:a,b,c,d,e依次入栈再出栈。D选项实现方案:a,b,c,d,e直接通过。

6、D     提高CPU的时钟频率,即提高了CPU的执行速度,显然是可以缩短程序的执行时间的。在计算机系统中,各个子系统通过数据总线连接形成的数据传送路径称为数据通路。优化数据通路结构,可以有效提高计算机系统的吞吐量,从而加快程序的执行。对程序进行编译优化,可以提高程序的执行效率,也可以实现缩短程序的执行时间。

7、D     此题关键点在static静态变量,在第二次运行fun时j值不会归0.

8、B     最小测试用例计算有2个标准:(1)如果在N-S图中不存在有并列的层次,则对应的最少测试用例数由并列的操作数决定,即N-S图中除谓词之外的操作框的个数。(2)如果在N-S图中存在有并列的层次A1、A2,A1和A2的最少测试用例个数分别为a1、a2,则由 A1、A2 两层所组合的 N-S图对应的最少测试用例数为a1×a2。图中1234567与89并列,2345又与67并列。则最小测试用例个数为(1+(5*3))*3=48.

9、A      注意重载由于多态的缘故对返回值不做要求。即仅改动返回值不是重载。

10、D    路由器使用统一的IP 协议,而结点交换机使用所在广域网的特定协议。

二、编程题

1、 作用:ARP协议是地址解析协议的缩写,所谓“地址解析”就是主机在发送帧前将目标IP地址转换成目标MAC地址的过程。ARP协议的基本功能就是通过目标设备的IP地址,查询目标设备的MAC地址,以保证通信的顺利进行。

  原理:在每台安装有TCP/IP协议的电脑或路由器裡都有一个ARP cache表,表里的IP地址与MAC地址是一对应的。在构造网络数据包时,首先从ARP cache表中找目标IP对应的MAC地址,如果找不到,就发一个ARP request广播包,请求具有该IP地址的主机报告它的MAC地址,当收到目标IP所有者的ARP reply后,更新ARP cache表,并利用此信息开始数据的传输。

  ARP欺骗的运作原理是由攻击者发送假的ARP数据包到网络上,尤其是送到网关上。其目的是要让送至特定的IP地址的流量被错误送到攻击者所取代的地方。 因此攻击者可将这些流量另行转送到真正的闸道或篡改后再转送。攻击者亦可将ARP数据包导到不存在的MAC地址以达到阻断服务攻击的效果。

2、转置矩阵的实现:设a为原始二维数组,则转置后的矩阵b[i][j]=a[col-1-j][i],其中col是列数。

    public static void matrixTrans(int[][] a)
    {
        int row = a.length;
        int col = a[0].length;
        for(int i=0;i<row;i++){
            for(int j=0;j<col;j++)
                System.out.print(a[col-1-j][i]+" ");
            System.out.println();
        }
    }

3、利用栈来检测括号的匹配,并使用StringBuffer重组字符串。

public static String delBrackets(String s)
    {
        if(s==null) return null;
        StringBuffer sb = new StringBuffer();
        Stack<Character> stack = new Stack<Character>();
        for(int i=0;i<s.length();i++){
            char c = s.charAt(i);
            if(c=='(')                        //若是左括号,直接压栈
                stack.push(c);
            else if(c==')')
                if(!stack.isEmpty()&&stack.pop()=='(')    //若是右括号,则判断栈是否为空以及栈顶元素
                    continue;
                else
                    return "error";
            else
                sb.append(c);                //非括号加入StringBuffer中
        }
        if(stack.isEmpty())                    //判断栈中是否还有'('
            return sb.toString();
        else
            return "error";
    }

4、 典型Top k的海量数据处理问题,解决方案一般是:分治+trie树/hash+小顶堆。即先将数据集按照hash方法分解成多个小数据集,然后使用trie树或者hash统计每个小数据集中的query词频,之后用小顶堆求出每个数据集中出频率最高的前K个数,最后在所有top K中求出最终的top K。

  此题内存只有2G,无法存放1T的数据集,需要进行hash(x)%1000分解成1000个小数据集,再对每个数据集进行HashMap统计每个词出现的频率,四核CPU可进行多线程并行计算,加快统计效率。先通过建立维护最小堆的方式找出每个小数据集的Top 100(先读取前100个数搭建最小堆,然后扫描后面的数据,并与堆顶元素比较,如果比堆顶元素大,那么用该元素替换堆顶,然后再调整为最小堆。最后堆中的元素就是Top 100,复杂度为O(n*log100)),最后再将结果归并。

  海量数据处理题可参考:http://blog.csdn.net/v_july_v/article/details/7382693

  代码实现(最小堆+多路归并):http://blog.csdn.net/jj8582/article/details/6890521

5、 求最长回文子串的长度有一个神奇的算法manacher将所有可能的奇数/偶数长度的回文子串都转换成了奇数长度:在每个字符的两边都插入一个特殊的符号。比如 abba 变成 #a#b#b#a#, aba变成 #a#b#a#,再利用动态规划的缓存原理实现,时间复杂度为O(n)。具体实现过程参考:http://blog.sina.com.cn/s/blog_3fe961ae0101iwc2.html

原文地址:https://www.cnblogs.com/dingshilei/p/4118186.html