技术类考生,在线笔试如何百分百通过(附练习资料)

又来给大家发福利啦,校招小达人就是我,帮助你们的我,哈哈哈

关于在线笔试

目前越来越多的公司采用在线笔试的形式,相信大家最近都已经考过很多了,具体的形式就不多说了,但是如何通过是重点,一般都是选择题加编程题或者甚至三道到五道编程题,所以编程题至关重要,选择题主要考察基础(那基础就显得至关重要),编程题主要考察在线编程,所以把基础弄好,在线oj搞清楚,笔试就稳过(文末可以给大家解释一下大家认为笔试中的玄学事件)

所以最大的秘诀,你把在线oj搞明白,就已经成功了一半,基础在这里就不多说了。

在线编程的意义

虽然笔试了那么多场,但是依然有很多同学不知道在线oj的意义,同时在笔试中也遇到了本地通过,在线就不通过的问题,这些同学也往往会觉得是系统的问题。

那么意义到底何在?

  • 如今越来越注重动手能力,通过这种形式能更好的考察学生的分析问题并利用计算机程序解决问题的能力;
  • 通过笔试,可以考察一个考生从实际问题中抽象得出数学模型的能力,利用所学的计算机专业知识对该模型进行分析求解的能力,以及利用计算机编程语言,结合数据结构和算法真正解决该实际问题的能力。

准备笔试过程中的注意事项

所以,大家在准备机试的过程中要特别注意以下几个方面:
1.如何将一个实际问题抽象成数学问题。例如,将高速公路网抽象成带权图,这就是一种简单的、直接的抽象。
2.如何将我们所学的计算机专业知识,运用到解决抽象出来的数学模型上去。这就要求我们在脑子里事先熟知一些常用的数据结构和算法,再结合模型求解的要求,很快地选择合适的编程思想来完成算法的设计。甚至可以利用一些经典算法特征,加入一些自己的优化,使得编写的程序更优雅、更高效(当然这是建立在充分理解经典算法的基础上)。

3.如何将我们为解决该数学模型所设计的算法编写成一个能被计算机真正执行的计算机程序。

关于这个能力的定义有三个层次:

①会编写(默写)一些经典算法的程序代码。

②能够将自己的想法或设计的算法转换为程序代码。

③能够使得自己编写的程序在大量的、多种多样的、极限的测试数据面前依旧正常完成功能(程序的健壮性)。我们在准备笔试的过程中,就要依次经历这三个层次,从而最后能够在实际笔试当中取得理想的成绩。

编程题的形式

绝大部分笔试所采用的形式,归结起来可以概括为:得到题目后,在计算机上完成作答,由计算机评判并实时告知结果的考试过程。

机试考试中的问题往往由五部分组成。

首先是问题描述,描述该问题的题面,题面或直接告知考生所要解决的数学问题、或给出一个生活中的实际案例,以待考生自己从中抽象出所要解决的数学模型。

第二是输入格式,约定计算机将要给出的输入数据是以怎样的顺序和格式向程序输入的,更重要的是它将给出输入数据中各个数据的数据范围,我们通过这些给出的数据范围确定数据的规模,为我们设计算法提供重要依据。

第三是输出格式,明确考生将要编写的程序将以怎样的顺序和格式输出题面所要求的答案。第四第五部分即输入、输出数据举例(Sample)。好的 Sample 不仅能为考生提供一组简单的测试用例,同时也能明确题意,为题面描述不清或有歧义的地方做适当的补充。

另外也要特别注意,题目中给定的两个重要参数:①时间限制。②空间限制。这两个重要的参数限定了考生提交的程序在输出答案之前所能耗费的时间和空间。

评判结果

这里将对评判系统评判考生提交程序后返回的结果做详细的说明,并且针对不同的返回结果,对可能出现错误的地方做出初步的界定。

Accepted(答案正确):你的程序对所有的测试数据都输出了正确的答案,你已经得到了该题的所有分数,恭喜。


Wrong Answer(答案错误):评判系统测试到你的程序对若干组(或者全部)测试数据没有输出正确的结果。
出现该种错误后,一般有两种解决方向:如果对设计的算法正确性有较大的把握, 那么你可以重点考虑代码健壮性,即是否存在某些特殊数据使程序出现错误,比如边界数据,比如程序中变量出现溢出。另一种方向,即怀疑算法本身的正确性,那么你就需要重新考虑你的算法设计了。


Presentation Error(格式错误):评判系统认为你的程序输出“好像”是正确的,只是没有严格按照题目当中输出所要求的输出格式来输出你的答案,例如你忽略了题目要求在每组输出后再输出一个空行。出现这种错误,往往预示着你离完全正确已经不远了,出现错误似乎只是因为多输出了一些空格、换行之类的多余字符而已。但这不是绝对的,假如在排版题(后文会有介绍)中出现格式错误,那么有可能你离正确的答案仍然有一定的距离。

Time Limit Exceeded(超出时间限制):你的程序在输出所有需要输出的答案之前已经超过了题目中所规定的时间。若这种结果出现在你的评判结果里,依然有两种方向可供参考:①假如你确定算法时间复杂度能够符合题目的要求,那么依旧可以检查是否程序可能在某种情况下出现死循环,是否有边界数据可能会让你的代码不按照预想的工作,从而使程序不能正常的结束。②你设计的算法时间复杂度是否已经高于题目对复杂度的要求,如果是这样,那么你需要重新设计更加高效的算法或者对你现行的算法进行一定的优化。

Runtime Error(运行时错误):你的程序在计算答案的过程中由于出现了某种致命的原因异常终止。

你可以考虑以下几个要点来排除该错误:①程序是否访问了不该访问的内存地址, 比如访问数组下标越界。②程序是否出现了除以整数 0,从而使程序异常。③程序是否调用了评判系统禁止调用的函数。④程序是否会出现因为递归过深或其他原因造成的栈溢出。Compile Error (编译错误):你提交的程序并没有通过评判系统的编译,可根据更详细的编译信息修改你的程序。

Memory Limit Exceeded (使用内存超出限制):你提交的程序在运行输出所有的答案之前所调用的内存已经超过了题目中所限定的内存限制。
造成这种错误的原因主要有两个方面:①你的程序申请过多的内存来完成所要求的工作,即算法空间复杂度过高。②因为程序本身的某种错误使得程序不断地申请内存, 例如因为某种原因出现了死循环,使得队列中不断地被放入元素。当然也千万别忽略自己的低级错误,比如在声明数组大小时多打了一个 0。Output 

Limit Exceeded(输出超出限制):你的程序输出了过多的东西,甚至超出了评判系统为了自我保护而设定的被评判程序输出大小的最高上限。



一般来说该种错误并不常见,一旦出现了也很好找原因。要么就是你在提交时忘记关闭你在调试时输出的调试信息(我经常输出 DP 时的数组来动态地观察状态的转移);要么就是程序的输出部分出现了死循环,使得程序不断地输出而超出系统的限制。
以上几种结果就是评判系统可能会返回的几个最基本的结果。若返回 Accepted,则你可以获得该题的所有分数。若返回其他错误,则根据不同的考试规则,你的得分将会有一定的差异。若你参加的考试采用按测试点给分规则,你依然能够获得你通过的测试点(即该程序返回正确结果的那部分测试数据)所对应的分数;但是,若你参加考试采用所有数据通过才能得分的评分规则,那么很可惜,到目前为止你在这道题上的得分依旧是 0 分。但是一般笔试都是按照比例得分。假如评判结果显示你提交的程序是错误的,你可以在修改程序后再次提交该题,直到获得满意的分数或者放弃作答该题。


编程中经常遇到的坑

循环输入输出处理常见问题

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/contestRoom

校招高频题目讲解

算法与数据结构基础: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、我笔试考的比他好,但是为什么他收到了笔试通知,而我没收到?

这种情况有以下几种原因,如果你遇到了,不一定属于哪种或者甚至哪几种原因:

1、你作弊了被发现了(不要跟我说什么他也作弊了,甚至他是抄的你的,没办法,不用管其他人,你确实作弊并且被发现了,只是不会告诉你这个事情)
2、笔试题目出的不好,想通过简历去筛一波人(他的简历比你的好,企业就是想给他一个面试机会)
3、通过简历和笔试成绩综合筛人(有的公司要结合这两种一起,所以可能他的简历加权了很多分)
4、你的简历某个字段不合适或者填写错误了(比如你的毕业时间不在筛选范围内,或者某个字段选错了,比如全日制和自考之类的,虽然只是选错了,但是有的企业确实不会管你,就会通过这些筛部分人)

2、为什么这个笔试我三道都AC了,但是另一个公司的笔试我只过了一道题就过了笔试?

每个公司笔试是针对自己公司的,报名这个公司的人数多少,排名,以及题目难易都会影响你,可能你答的好,其他人答的更好,或者说如果题目简单,拉不开档次,又会通过简历来加筛一波,所以要想通过,你只有做的更好,排名更高。

同时,想告诉大家也不要过于紧张和纠结于是否被判为作弊这个事情

很多同学有点过于在乎是否被判作弊了,我在这里说一下,牛客网不会误判每个人的笔试情况,你没有作弊不会给你判作弊的,还有就是跳出多次或者没有摄像头,这种hr都能看出来,但是不会直接给你判作弊,具体最终的决定还是由hr来决定,我们能按照要求去做和准备的最好还是去准备的,真的会有的公司的hr觉得你都没有去认真读考前须知或者邮件,那这样的人及时你考过了我们也不想要,所以确实有这种情况,我们就不要去挑战权威,同时,也不要因为跳出超限或者自己没有收到笔试通知就觉得自己被判作弊了,很多同学来问的时候,基本都是得了0分到25分,或者是排名非常靠后的,所以真的没有必要担心的。

大家还想知道什么笔试中的小秘密,可以回帖留言,作为一个跟了三年校招的老司机,我帮大家答疑解惑~~

总之,你答的好不会给你减分,反而是加分,也有可能你排了第一,虽然简历不合适,企业就想给这人一个格外的机会呢,要做的不是怨天尤人,而是去给自己创造机会,提升自己的能力。要相信,在这个互联网大环境下,是金子真的会发光的。

全部评论
5
点赞 回复 分享
发布于 2020-03-06 20:40
远程共享桌面会被发现吗
点赞 回复 分享
发布于 2019-08-31 01:41
干货
点赞 回复 分享
发布于 2018-09-27 14:41
谢谢牛妹!
点赞 回复 分享
发布于 2018-09-18 14:28
太难熬了
点赞 回复 分享
发布于 2018-09-18 14:28
这样一讲我每次在图书馆连wifi笔试,破wifi每次都断好几次弄得我好慌。
点赞 回复 分享
发布于 2018-09-17 16:18

相关推荐

点赞 评论 收藏
分享
评论
9
135
分享

创作者周榜

更多
牛客网
牛客企业服务