记一次某AMCAT测评网站在线编码测试
几天前某公司HR发来消息,要求参加某AMCAT标准测试网站的在线测评,据说是技能测试,测试题目均为通用性试题。
打开测试链接登录成功,提示需要打开摄像头,允许摄像头权限,录入相关信息后进入考试引导界面,看清楚相关操作后跳转到正式测评界面。看到第一个题目,阅读题干,选择编程语言(里面发现可以选择的语言还是蛮多的C、C++、Java、C#)准备做题发现界面卡住了,尝试刷新了一下页面发现直接强制退出了。再次登录时提示请N分钟后再次尝试……
等待了漫长的几分钟,重新登录成功,开始做第一题。第一题大概是这么描述的:“某商户需要设计一个算法寻找幸运客户,在系统输入数字N,返回一个数字X用于代表第X个订单,该订单对应的便是幸运客户。该算法中生成一个序列,其中每个数字是前2个数字之和,一开始序列中包含2个初始数均为1。”其实题目罗嗦来一堆废话,真实意图是需要我们返回斐波那契数列/兔子数列(Fibonacci sequence)的第N个数。
斐波那契数列(Fibonacci sequence)
这个以前上学的时候就写过,这个算法有2种写法,递归方式和非递归方式。上学那时候只想到过递归,实现很简单:n=1返回1,n=2返回1,其他返回f(n-2)+f(n-1)。但是递归这种方式效率很差。非递归的方式:
public static long getNumber(int n) {
long[] f = new long[n + 1];
f[1] = 1; f[2] = 1;
for (int i = 3; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
return f[n];
}
事后在线下电脑测试对比了2种算法的效率,输入N=50时:输出结果12586269025,递归方式耗时63秒描述,循环数组赋值方式耗时0秒,当N=100时递归方式等了几分钟都没有得出结果。
第二题,题目意思大概是输入一串字符串,输出字符串中不符合规则(A-Z、a-z、空格、0~9)的字符。这个题目还算比较简单,解法多种多样,就不在此处累述了。
考试心得
这类网站的测评题目一般不会太难,比起那些ACM算法题目还是简单了不少,当然运气不好遇到题目都看不懂的就郁闷了。最重要的是审题看懂题目意思,有时候只看题干不是很理解,可以结合下面的样例说明,理解题目意思就好办了。
选择自己最熟悉的编程语言,最基本的语法要很熟悉,因为这种在线编程测评的网站,编辑器的语法提示功能你不要指望能有多强大,基本上只能使用System下面的包或者类库。
题目可以切换,如果遇到第一道题目觉得没有思路,不妨切换到第二道题目等完成第二道题,返回再做第一题。
编写的代码算法要考虑效率问题,在时间足够的前提下。另外需要注意输入参数是否需要考虑边界问题。
调试的时候,需要注意测试用例是否都通过,一般会有提示:n个测试用例通过n1个,不通过个数n2。如果有不通过的情况,可以检查代码进一步优化。