技术类考生,在线笔试如何百分百通过(附练习资料)
又来给大家发福利啦,校招小达人就是我,帮助你们的我,哈哈哈
关于在线笔试
目前越来越多的公司采用在线笔试的形式,相信大家最近都已经考过很多了,具体的形式就不多说了,但是如何通过是重点,一般都是选择题加编程题或者甚至三道到五道编程题,所以编程题至关重要,选择题主要考察基础(那基础就显得至关重要),编程题主要考察在线编程,所以把基础弄好,在线oj搞清楚,笔试就稳过(文末可以给大家解释一下大家认为笔试中的玄学事件)
所以最大的秘诀,你把在线oj搞明白,就已经成功了一半,基础在这里就不多说了。
在线编程的意义
虽然笔试了那么多场,但是依然有很多同学不知道在线oj的意义,同时在笔试中也遇到了本地通过,在线就不通过的问题,这些同学也往往会觉得是系统的问题。
那么意义到底何在?
- 如今越来越注重动手能力,通过这种形式能更好的考察学生的分析问题并利用计算机程序解决问题的能力;
- 通过笔试,可以考察一个考生从实际问题中抽象得出数学模型的能力,利用所学的计算机专业知识对该模型进行分析求解的能力,以及利用计算机编程语言,结合数据结构和算法真正解决该实际问题的能力。
准备笔试过程中的注意事项
所以,大家在准备机试的过程中要特别注意以下几个方面:
1.如何将一个实际问题抽象成数学问题。例如,将高速公路网抽象成带权图,这就是一种简单的、直接的抽象。
2.如何将我们所学的计算机专业知识,运用到解决抽象出来的数学模型上去。这就要求我们在脑子里事先熟知一些常用的数据结构和算法,再结合模型求解的要求,很快地选择合适的编程思想来完成算法的设计。甚至可以利用一些经典算法特征,加入一些自己的优化,使得编写的程序更优雅、更高效(当然这是建立在充分理解经典算法的基础上)。
3.如何将我们为解决该数学模型所设计的算法编写成一个能被计算机真正执行的计算机程序。
关于这个能力的定义有三个层次:
①会编写(默写)一些经典算法的程序代码。
②能够将自己的想法或设计的算法转换为程序代码。
③能够使得自己编写的程序在大量的、多种多样的、极限的测试数据面前依旧正常完成功能(程序的健壮性)。我们在准备笔试的过程中,就要依次经历这三个层次,从而最后能够在实际笔试当中取得理想的成绩。
编程题的形式
绝大部分笔试所采用的形式,归结起来可以概括为:得到题目后,在计算机上完成作答,由计算机评判并实时告知结果的考试过程。
机试考试中的问题往往由五部分组成。
首先是问题描述,描述该问题的题面,题面或直接告知考生所要解决的数学问题、或给出一个生活中的实际案例,以待考生自己从中抽象出所要解决的数学模型。
第二是输入格式,约定计算机将要给出的输入数据是以怎样的顺序和格式向程序输入的,更重要的是它将给出输入数据中各个数据的数据范围,我们通过这些给出的数据范围确定数据的规模,为我们设计算法提供重要依据。
第三是输出格式,明确考生将要编写的程序将以怎样的顺序和格式输出题面所要求的答案。第四第五部分即输入、输出数据举例(Sample)。好的 Sample 不仅能为考生提供一组简单的测试用例,同时也能明确题意,为题面描述不清或有歧义的地方做适当的补充。
另外也要特别注意,题目中给定的两个重要参数:①时间限制。②空间限制。这两个重要的参数限定了考生提交的程序在输出答案之前所能耗费的时间和空间。
评判结果
这里将对评判系统评判考生提交程序后返回的结果做详细的说明,并且针对不同的返回结果,对可能出现错误的地方做出初步的界定。
Runtime Error(运行时错误):你的程序在计算答案的过程中由于出现了某种致命的原因异常终止。
编程中经常遇到的坑
循环输入输出处理常见问题
1、为什么需要循环输入输出:通常来说OJ对于每道题里面有.in和.out文件,分别表示测试数据的输入和输出。如果某些编程题的所有数据都只做在一个.in和一个.out中,这样就会变成多组测试了,所以需要提交的代码中循环处理。
2、处理方法:其实这个问题可以避免,就是编程题后台每个样例做一组对应的.in和.out文件,这样就变成单组测试,代码就不需要循环处理,但是平时练习的题目质量不一,这个问题都会出现。
代码里面循环处理了即使是单组测试也会完全没问题,所以为了偷懒,可以全写成循环处理。
3、还有一个坑:但是这里会发生一个问题(十分常见!!!!),如果测试数据是多组的,但是恰巧你代码里面需要些标记数组,map,set等,在循环内一定记得清空,不然可能会产生前面的测试样例影响了后续数据的答案。
对于各种语言的一些基本知识
做编程题强烈建议使用C/C++,做编程题强烈建议使用C/C++,做编程题强烈建议使用C/C++,做编程题强烈建议使用C/C++
重要的事情比三遍再多说一遍,下面说说具体理由:
1、出题人通常会使用C/C++编写标程,数据也是由标程制造的,所以使用跟出题人一样的语言会比较稳妥
2、C/C++效率比较高,通常来说一般OJ对于一道题目的时限限制会区分C/C++和其他语言,通常处理方式是假设C/C++时限是1s,其他语言就会给2倍时限,甚至更多。
--------------------------------------------我是分割线----------------------------------------------
3、关于cin cout和scanf printf。做题的时候尽量使用scanf printf。下面告诉一个小常识,不要惊讶:cin cout比scanf printf慢20倍左右!!!!!!!
一旦遇到大数据量,光是读入就有可能跪掉。
你或许可以使用std::ios::sync_with_stdio(false); 这条语句关掉scanf和cin的同步,加快效率。但是即使这样cin还要慢5倍左右,而且一旦使用了这条语句,scanf和cin混用可能就会造成一些奇怪的错误
4、Java相关:Java整体效率大概比C/C++慢2~3倍,但是Java写编程题也没什么问题,主要就是处理好各种输入输出的情况。
5、python等等其他语言,做编程题真心不建议使用这些语言,要么效率低下,要么会有些更深的坑。
关于输出格式
格式问题经常令人抓狂,其实主要都有几个常见的坑
1、行末空格:比如我输出需要打印多个数需要使用空格分隔的时候,我们循环使用printf("%d ",x);这种会很方便,但是这样会导致行末多一个空格,后台系统会严格比对你的输出和.out文件,这样也会被判错误
2、换行问题,对于每个样例,建议输出完全之后都换行一下。对于一些题目,可能就是不换行就导致了后面输入数据错位,那就肯定不可能过了。
关于时间复杂度分析:
通常来说一般的系统1s能跑的算法量级是不足1e8的,所以做题的时候评估算法效率很重要,直接判断你的做法能否通过,当然这是以C/C++为标准的,其他语言自己乘个时间倍数。。
举个例子,比如题目n = 1e5,那么我就可以很敏感的知道我的算法需要一个 O(n) 或者 O(nlogn)。平方复杂度直接拜拜!
最后关于 "我本地能通过,交上去就是不对"
这个问题很蠢!通不过就是有一些问题。一个是要累积经验,分析到底可能出现的问题在哪里。另外不要使用一些奇怪的函数和行为。之前有见过有人使用了windows和linux平台那个功能的函数名都不一样的奇葩函数。 如果你使用C/C++,最好别使用VS来写算法code,这个默认是MS的,一般OJ上面编译器都不会是这个鬼。
关于在线编程详解
这里给大家限时免费提供了老师讲解的在线OJ的详细讲解,里面详细讲解了大家在笔试过程中遇到的各种问题,大家可以看一下:https://www.nowcoder.com/study/vod/7/1/1
不然真的在在线笔试中大家本来会的题目但是没有得分就很可惜了。
在线编程训练
平时多加练习,更熟悉,才能在真正笔试中得心应手,当然,这些是你能力的提升,得到的益处肯定不只是笔试通过的。
剑指offer:https://www.nowcoder.com/ta/coding-interviews
leetcode:https://www.nowcoder.com/ta/leetcode
程序员面试金典:https://www.nowcoder.com/ta/cracking-the-coding-interview
2016校招编程题汇总:https://www.nowcoder.com/ta/2016test
2017校招编程题汇总:https://www.nowcoder.com/ta/2017test
华为机试题:https://www.nowcoder.com/ta/huawei
校招高频题目讲解
算法与数据结构基础:https://www.nowcoder.com/courses/semester/algorithm-elementary
高频题目详解:https://www.nowcoder.com/courses/semester/algorithm-senior
高频题目详解:https://www.nowcoder.com/courses/cover/live/124
关于牛客网在线笔试常见问题及准备
当然,在线笔试是需要自己准备设备和环境的,以及每家公司笔试都有具体的要求,会在发送的邮件通知或者考前须知里有写明,这些写了都不是白写的,一定要去看,提前准备好这些(包括网络环境等),如果现场因为这些问题浪费了时间或者怎样,就真的可惜了。
牛客在线笔试常见问题:https://www.nowcoder.com/discuss/92224?type=0&order=0&pos=349&page=3
关于玄学
很多同学都说笔试是玄学的,其实只是大家不知道很多小秘密,所以不管怎样,都不是你不好好准备笔试和好好笔试的理由,笔试成绩高是绝对有好处的,反而笔试成绩差只有少部分还有额外的机会可以进入面试
1、我笔试考的比他好,但是为什么他收到了笔试通知,而我没收到?
这种情况有以下几种原因,如果你遇到了,不一定属于哪种或者甚至哪几种原因: