【笔试在线编程踩的坑】--- OJ常见问题

引言

最近参加了几场笔试,可能是备战不足吧,被一些题目的输入输出给绊倒了,浪费了很多时间,甚至有些题直接通过0测试用例,但是自己的算法和代码完全没毛病,下来查阅资料,仔细梳理了一些关于输入输出的常见问题分享给大家。

关于牛客网

牛客网相信各位小伙伴都很熟悉吧,“要入职,线上牛客网”,上边有一期关于输入输出的竞赛,我觉得很不错,尤其是对于像我这种编程“小白”来说很有用,练习常见的输入输出问题!!!
牛客网输入输出练习(点击进入:https://ac.nowcoder.com/acm/contest/320)
在这里插入图片描述

OJ概念

online judge,简称OJ,是一个在线的判题系统。用户可以在线提交多种程序代码(比如:C、C++、Java、Python等),系统对源代码进行编译和执行,并通过预先设计的测试用例来检验程序源代码的正确性。现广泛应用于世界各地高校学生程序设计的训练、作业的自动提交判断,以及各种竞赛(比如ACM)等。

OJ原理

用户提交的程序在OJ系统下执行时将受到比较严格的限制,包括运行时间限制,内存使用限制和安全限制等。用户程序执行的结果将被OJ系统捕捉并保存,然后再转交给一个裁判程序。该裁判程序或者比较用户程序的输出数据和标准输出样例的差别,或者检验用户程序的输出数据是否满足一定的逻辑条件。最后系统返回给用户一个状态:通过、答案错误、超时、超过输出限制、超内存、运行时错误、格式错误、或是无法编译,并返回程序使用的内存、运行时间等信息。

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

1、为什么需要循环输入输出:通常来说OJ对于每道题里面有.in和.out文件,分别表示测试数据的输入和输出。如果某些编程题的所有数据都只做在一个.in和一个.out中,这样就会变成多组测试了,所以需要提交的代码中循环处理。

2、处理方法:其实这个问题可以避免,就是编程题后台每个样例做一组对应的.in和.out文件,这样就变成单组测试,代码就不需要循环处理,但是平时练习的题目质量不一,这个问题都会出现。代码里面循环处理了即使是单组测试也会完全没问题,所以为了偷懒,可以全写成循环处理。

3、大坑:如果测试数据是多组的,但是恰巧你代码里面需要些标记数组,map,set等,在循环内一定记得清空,不然可能会产生前面的测试样例影响了后续数据的答案。

对于各种语言的一些基本知识

1、出题人通常会使用C/C++编写标程,数据也是由标程制造的,所以使用跟出题人一样的语言会比较稳妥

2、C/C++效率比较高,通常来说一般OJ对于一道题目的时限限制会区分C/C++和其他语言,通常处理方式是假设C/C++时限是1s,其他语言就会给2倍时限,甚至更多。

3、关于cin cout和scanf printf。做题的时候尽量使用scanf printf。下面告诉一个小常识,不要惊讶:在数据量比较大的情况下cin cout比scanf printf慢挺多。一旦遇到大数据量,光是读入就有可能跪掉。你或许可以使用std::ios::sync_with_stdio(false); 这条语句关掉scanf和cin的同步,加快效率。但是即使这样cin还要慢,而且一旦使用了这条语句,scanf和cin混用可能就会造成一些奇怪的错误

4、Java相关:Java整体效率大概比C/C++慢2倍以上,但是Java写编程题也没什么问题,主要就是处理好各种输入输出的情况。

5、python等等其他语言,做编程题首先要自己在平台上多练习不同的数据格式的读取方法,还有就是效率可能偏低,另外有些语言封装的功能太丰富了,以至于代码里各种函数完成的最终代码,笔试官或者面试官对于算法的考察并不想看到这样的code。

6、开辟数组空间最好根据题目的数据范围要求来,这里可能会造成runtime error,如果代码中递归的深度太深也可能爆栈空间导致runtime error。

关于输出格式

1、行末空格:比如我输出需要打印多个数需要使用空格分隔的时候,我们循环使用printf("%d ",x);这种会很方便,但是这样会导致行末多一个空格,后台系统会严格比对你的输出和.out文件,这样也会被判错误
2、换行问题,对于每个样例,建议输出完全之后都换行一下。对于一些题目,可能就是不换行就导致了后面输入数据错位,那就肯定不可能过了。

关于时间复杂度分析

通常来说一般的系统1s能跑的算法量级是不足1e8的,所以做题的时候评估算法效率很重要,直接判断你的做法能否通过,当然这是以C/C++为标准的,其他语言自己乘个时间倍数。。

举个例子,比如题目n = 1e5,那么我就可以很敏感的知道我的算法需要一个 O(n) 或者 O(nlogn)。平方复杂度直接超时!

关于 “我本地能通过,交上去就是不对”

提交不成功,一般就两种情况

  1. 代码语法问题,导致编译不同过
    a.多去刷题,将常犯的错误积累下来
    b.避免使用一些奇怪的函数,或者与平台相关的函数
    c.最好不要使用vs来写算法,vs默认是Windows下的方式,一般OJ编译器可能无法识别
  2. 代码编译成功,提交不成功
    a.查看输出不成功的信息,输出格式不对还是无法通过某个测试用例
    b.对于无法通过的测试用例,一般都会将无法通过的用例显示出来,然后提供一个本该输出与程序输出,通过输出结果以及测试用例,检查代码那块有误。
    c.实在检查不出来,逐个测试用例处理
  3. 自己编译器可以执行,但是OJ不可以通过
    如有部分同学会说,在自己的编译器上可以跑通代码,但是在OJ上面不可以提交原因是什么?这种问题有很
    多种,比如传入的参数没有进行合法检查,例如:指针没有判空等等。这种问题大多是这些边界的问题

本文参自(https://www.nowcoder.com/discuss/8632)

发布了57 篇原创文章 · 获赞 301 · 访问量 4万+

猜你喜欢

转载自blog.csdn.net/L19002S/article/details/105069436
今日推荐