首页 > 代码库 > Java笔试题解析(二)——2015年唯品会校招

Java笔试题解析(二)——2015年唯品会校招

以前总是看别人写的笔经面经,今天自己终于可以写自己亲身经历的一篇了

T-T。


前阵子去了唯品会的秋招宣讲会,华工场(现在才知道原来找家互联网公司工作的人好多),副总裁介绍了VIP的商业模式是逛街式的购物,与京东和淘宝不同。宣讲会之后还没有笔试。网上找了一些以前的题目,当练练手。



2014校招的。

 1.下列不可作为java语言修饰符的是(D)

 A. a1 B. $1

 C. _1 D. 11


这题目有问题,修饰符是public这些,不能作为变量名才对。



 2.整形数据类型中,需要内存空间最少的是(D)

 A. short B. long

 C. int D. byte


byte为8bit,long和double 64bit,int和float 32bit,char和short 16bit。

一个字节8个bit。


3.在java中,一个类可同时定义为许多同名的方法,这些方法的形式参数个数、类型或者顺序各不相同,传回的值也可能不相同,这种面向对象的特性称为(C)

 A. 隐藏 B. 覆盖

 C. 重载 D. java不支持此特性


重载定义就如题目所讲。

覆盖就是重写,是子类重写父类方法,参数名和方法名要相同,返回类型和抛出异常比父类小(这里的小不是大小,是范围),访问修饰符访问权限大于等于父类。

当然这里有例外:

就是以前在Java编程思想多态中提到的:

public class TV{  
    private void show(){  
        System.out.println("TV");  
    }  
    public static void main(String[] args) {  
        TV tv = new LeTV();  
        tv.show();  
    }  
}  
class LeTV extends TV{  
    public void show(){  
        System.out.println("LeTV");  
    }  
} 
虽然看起来像是“覆盖”,但是没有,private方法自动认为是final方法,对导出类屏蔽,LeTV的show其实是新的方法,main方法打印的也是TV,因为这不是覆盖。如果private换成protected是可以的(访问修饰符访问权限大于等于父类)。

隐藏的话:

    public class TV{  
        public int price = 10;  
        public int getprice(){  
            return price;  
        }  
        public static String getString(){  
            return "tv";  
        }  
    }  
    class LeTV extends TV{  
        public int price = 20;  
        public int getprice(){  
            return price;  
        }  
        public int getsuperprice(){  
            return super.price;  
        }  
          
        public static String getString(){  
            return "letv";  
        }  
          
        public static void main(String[] args) {  
            TV tv = new LeTV();  
            System.out.println(tv.price+" getprice:"+tv.getprice()+tv.getString());  
            LeTV letv = new LeTV();  
            System.out.println(letv.price+" getprice:"+letv.getprice()+" getsuperprice:"+letv.getsuperprice()  
                    +letv.getString());  
        }  
    }  
本来会打印的10和LeTV都被隐藏了,其实域的访问是在编译期间解析,不是后期绑定,而后期绑定是运行期间,所以被隐藏了。
普通的方法才会覆盖,后面符合多态的特性,而静态方法只和类有关,和具体的对象无关,所以LeTV被隐藏了。


简答:

 1.详述堆和栈,进程和线程的含义?

栈的话先进后出,好比先一个箱子,先放进去的东西压在下面,拿出来的时候先把后面放进去的东西拿开。

堆是先进先出,如购买基金,首先赎回的基金是自己最先买入的。

至于进程和线程,最能先说出的就是一个进程包含一个或多个线程。

其实一个程序至少有一个进程,一个线程只属于一个进程,总体看的话进程可以看成是程序的一次执行,线程是程序片段的一次执行。


区别:进程间相互独立,同一进程下的线程共享全部资源。

           进程有自己独立的内存空间,线程共享所属进程的内存空间。


真的要像阮一峰那样类比也可以,CPU是工厂有很多车间,单核心的CPU在一个时间内只运行一个车间(进程),车间有多个工人工作(线程)。


 2.有一个动态数据集(数据实时变化)。现在需要对该数据集用到多种视图进行展示,比如直方图,曲线图和饼图等,在这样的应用场景下,使用哪几种设计模式比较合适?

这个不太会。


 第三部分:

 1.对一对扑克牌进行排序,时间复杂度尽可能小,请使用自然语言描述算法核心思想,并指出使用算法的时间复杂度,使用java语言描述具体算法的实现。

 (桶排序),这是师姐的方法。

 2.在Linux操作系统下,有一个文本(文件名为user).格式如下:

 Leo:456:7890:11

 Vincent:333:43434:2

 Rack:4343:4343:22

 Leo:444:33:4343

 Rack:1:1:1

 Tiger:1:32:4

 要求:

 1. 提取第二列的值,并对其进行排序.

 2. 计算第二列的总和。

 3. 找出第二,三和四之和的最大值。

 4. 假如有一百万个这样的文本,每个大小为500M,用最快的方式统计哪个用户(第一列)的后面三列之和最大。

 注:可以用java或者shel脚本实现以上功能。


以上试题来自:http://blog.csdn.net/aacm1992/article/details/14907315#comments



2015校招

后面网申后收到笔试通知

1.笔试

总体不是太难,考察方向全面。

(1) 5道选择题,比较基础,后面都是问答题。


(2) 数据库一题,二选一,一个是用group by和count查询出选修课程在2~3门之间的学生,另一个是给出两个数据库表,让你对数据库模型进行优化。


(3) 操作系统一题,二选一,一个时间片的问题,这个不太会,挑了第二道题做,第二道题问的是进程间共享数据的方式,其实就是进程间传播和交换信息。

1)共享内存,内存由一进程创建,其他进程共享。

2)信号量,计数器,控制资源访问。

3)管道,在具有亲缘关系的进程中使用,通常指父子进程关系。


(4) 数据结构与算法,二选一,第一题忘了,第二题是给出一个时间段的股票价格趋势,问你何时买入何时卖出获取最大利润。

先说自己的土方法,鉴于算法是渣渣,然后写了两个for循环嵌套,就是每个价格都去减,结果当然是对的,但是复杂度当然就弱爆了。


后面就去问人了。

其实有这样一个窍门,先找出全部价格中的最低的价格,然后往后找到最高价格,相减。

再找出全部价格中的最高价格,往前找最低价格,相减。

两个中最大值便是最大利润,这是我后面问人的,画图画了之后感觉是对的

原来,窍门是错的,5 10 2 8 1 3。窍门的话得出结果是5,其实8-2才是最大值。


后面去问了671coder,acmer就是不一样,给出了动态规划的方案,代码看到之后大吃一惊。

int max = -1;
int ans  = -1;
for (int i=len-1; i>=0; i--)
      if(num[i]>max)
             max=num[i];
       if(max- num[i] > ans)
             ans = max- num[i];
return ans;
每次将最大值存进去,遇到更大的利润再替换。复杂度才O(N)。


(5) 计算机网络,二选一,一道是子网掩码,一道是TCP与UDP区别:

TCP(TransmissionControlProtocol)和UDP(UserDatagramProtocol)协议属于传输层协议。

TCP可靠,相对负载比UDP大。


(6) 最后一道,附加题。

就是传说中的爱因斯坦出的推理题目,5个国家,5间房子,5种宠物啤酒那道题。之前推过。不停假设推理根据条件推翻,得出答案。


2.一面

后面收到通知,很是兴奋,第一次技术面试(好吧,别人已经拿到batoffer的时候,我才第一次技术面试)。


面试是在一间教室里面,教室有6,7个面试同时进行,我和面试官坐同一排椅子,隔了一个座位,我的面试官人很nice,经常笑,还是头后仰哈哈大笑那种,整体和日常聊天一样。但是由于第一次技术面试,刚开始有点紧张。


一面总体还是看你对基础的东西的了解,投的是Java方向的。

问我做的项目。

回答用了框架写的,然后各自大体有什么作用。框架搭了多久。


servlet了解吗?

servlet生命周期,再由doGet,dotPost方法联系到get和post的区别,之前简单的想到url地址后面跟不跟数据可不可靠(回去查了之后发现还有一个大区别,get传输数据小,限制在2kb左右,但是速度快一些,所以数据小不在乎安全性,可以直接用get,post传输数据相对大,传文件用post)。


再由servlet跳到JSP。

jsp跳转的方式,糟了,直接更面试官说忘了,好久没写了,面试官说没关系。忘记的同学请脑补。


然后再拿笔试题进行询问。问的还是思路多一些。说完问了我打什么游戏——dota,然后又是扯了一大堆东西。


又谈回技术。

讲面向对象的三大特性,封装体现在哪,多态是什么。

这个放假看过编程思想,blabla讲出来,还比划例子。


了解设计模式吗?

单例,讲了用法,应用什么的。


最后面试官的总结,总体不错,但是人太多了,这句话的意思我也听懂了。后面说了声谢谢离开了教室。


前前后后花了半个钟多一些,作为第一次面试,个人感觉还可以吧。面完继续参加其他的两场笔试。


希望自己早日找到一份好的实习,可以去公司见见更多的牛人,学到更多,也同其他的同学一起努力,不停地去尝试吧。


不试试怎么会知道呢?——Go桌面人力资源副总监,宣讲会说的一句话。

Java笔试题解析(二)——2015年唯品会校招