今天是阿里巴巴2015春季实习生招聘的在线笔试。也是我第一次的在线笔试,记录一下。
阿里在线笔试的形式是40分钟做20道单选选择题,80分钟做3道大题。阿里并没有什么摄像头或者离开页面次数终止答题之类的防作弊机制。靠的是自觉。
先说20道选择题,每个人都是随机的,好像和岗位也没太大关系,考的范围很广,涉及有智力题、逻辑题、概率等数学问题;然后基本C程序设计的一些问题,一段简单程序判断输出结果;基础数据结构的问题(排序、查找、图、动态规划),有些题目是知识点的形式,有些就是一个实际计算的题目(居多)
个人感觉题目还是比较好的。
选择题其实平均两分钟根本做不完啊(大神除外),所以你要挑的就是你会的,一看题目你就知道考察的知识点是啥的。然后花时间去做。
其实题目都不是非常难,除非你完全不了解考察的知识点,花点时间都可以做的,就是看你怎么去分配这个时间了。= =好纠结的。
我感觉我就是看下题目感觉要花点时间的就跳了。太捡题目感觉也不好。因为普遍一些题目都是要微微思考的。挑来挑去反而浪费时间。
然后还是先做简单的吧。有个题目很简单,但是一直在做一些其他的题,做完又随便点了下又做其他的题,最后都没有做到时间就没了= =我就有好东西剩到最后吃的强迫症怎么办
所以而且有些题目时间量比较多又不是非常确定的花了很长的时间做,反而有些简单的却没做了。特别就是最后10分钟,选了一道排序题,涉及到二叉查找树的构建和前序遍历,做了半天没解完,其实内容不是非常熟,但是又不想放弃,本来还想留时间做一道i++的简单的题,结果那道题题目都没时间仔细看,最后只有乱选了。
还有硬性知识点的考察,不会就不会了吧。感觉百度都很浪费时间= =
不会或者没解出来的,是不是乱蒙呢?因为是单选,6选1的概率,= = 最后一分钟我还是乱选了,考试的惯性思维吧,结束之后同学建议就是说不会或者没时间做的就直接不选,好像也是吧。
3道大题,第一道是系统设计题,如下
实现一个洗车保养服务系统,说明商品模型、设计思路和主要功能操作的具体逻辑。
第二道题是编程题
从自然数1到1000中,随机取900个不重复的数并打印出来。
代码如下:
import java.util.Random;
public class RandomPrint {
public static void main(String[] args) {
int slen = 1000;
int rlen = 900;
int[] source = new int[slen];
int[] result = new int[rlen];
for (int i = 1; i < slen + 1; i++)
{
source[i - 1] = i;
}
Random random = new Random();
int index = 0;
for (int i = 0; i < result.length; i++)
{
index = random.nextInt(slen--);
result[i] = source[index];
source[index] = source[slen];
}
for(int j: result)
{
System.out.print(j + "\t");
}
}
}
这里说明一下,我的代码都是先在eclipse里面写了再COPY到网页上的,不是在网页上纯手打的,不知道有没有关系。
第三大题的题目是:
实现一个模拟过程,有个人不断往苹果箱子里放苹果,一个人不断从苹果箱子里取苹果,苹果箱子的容量为5.
类似于生产者/消费者的问题。
代码如下:
package com;
import java.util.LinkedList;
public class Apple
{
private LinkedList<Object> storeHouse = new LinkedList<Object>();
public Apple()
{
}
public void start()
{
new Put().start();
new Get().start();
}
class Put extends Thread
{
public void run()
{
while (true)
{
synchronized (storeHouse)
{
try
{
while (storeHouse.size() == 5)
{
System.out.println("storeHouse is full , please wait");
storeHouse.wait();
}
Object newOb = new Object();
if (storeHouse.add(newOb))
{
System.out.println("Put an apple to storeHouse");
//Thread.sleep((long) (Math.random() * 1000));
storeHouse.notify();
}
}
catch (InterruptedException ie)
{
System.out.println("interrupted!");
}
}
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
class Get extends Thread
{
public void run()
{
while (true)
{
synchronized (storeHouse)
{
try
{
while (storeHouse.size() == 0)
{
System.out.println("storeHouse is empty , please wait");
storeHouse.wait();
}
storeHouse.removeLast();
System.out.println("Get a apple from storeHouse");
//Thread.sleep((long) (Math.random() * 1000));
storeHouse.notify();
}
catch (InterruptedException ie)
{
System.out.println("interrupted");
}
}
try {
Thread.sleep((long) (Math.random() * 1000));
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
public static void main(String[] args) throws Exception
{
Apple apple = new Apple();
apple.start();
}
}
之所以把sleep标红是因为我提交的代码是把sleep写到上面被注释掉的位置了。如果在synchronized里面sleep应该是会一直锁住这个对象的,外面又是个while循环,就又开始竞争该对象锁了。