2020年牛客网校招编程笔试题相关问题

这里主要是介绍一些关于牛客网上面编程题笔试系统的一些容易踩的坑。希望大家春招顺利!据说点一下关注可以拿到满意的 offer!

1. 接口类型测试

牛客网的编程题目分为两种形式,第一种形式是完善核心代码模式:
在这里插入图片描述
这种模式是仿照 LeetCode 网站上面的类型格式,一般都是在题目中说明函数需要实现的功能,比如查找两个链表的交点节点。Solution 类中的函数就是考生需要补全的内容,函数会按照给定的格式传入参数,我们需要完成的就是将函数需要完成的功能进行实现,并且把计算结果通过返回值返回出去。那么如果我们想要写其他的函数作为辅助怎么办呢?当然在函数的外边(Solution 类里面)声明其他变量,或者是函数都是可以的。

注意:例子中上方注释中给出的内容是为了提示考生 ListNode 的定义,考生在程序中无需声明该内容,系统判题时会自动添加进去。

代码提交之后,系统中的判题程序将会自动为填写的内容补全调用程序,然后使用测试数据对程序进行测试,根据通过测试的组数,给出程序的得分。那么如果说,如果我的程序其他地方都对,但是有一点地方写错了没有通过编译,那么我可以获得部分分数吗?很遗憾这样因为没有通过任何测试数据,当然是没有分数的。那如果我不会写这道题,但是我猜测测试数据会有一组的答案是1,那么我直接让函数无脑返回1,会获得部分分数吗?如果测试数据中真的有结果是1的测试点,那么是可以获得分数的。也就是说,我们提交的代码获得多少分数,完全取决于通过的测试数据数量,全程机器判题。( 但是这里也不排除有的企业会导出学生提交的代码进行人工复查的情况,我们说的得分只是针对题目,系统判题后显示的分数

这一类型的题目一般相对来说测试数据的规模较小,在不说明数据范围的情况下,可以大胆的进行尝试,哪怕获得部分分数也是值得的,另外如果给定了数据范围,但是感觉没办法解决这么大数据范围的题目,可以写代码只解决小范围的数据来获取部分分数,因为很有可能最大范围的数据只有一组。

还有考试过程中可以无限的进行提交,每次提交都会得到自己程序的得分,但是最后的总分是以最后一次提交的代码为准的,所以可以大胆的放心进行提交。

2. 标准输入输出类型测试

牛客网上第二种测试模式就是:ACM编程题模式。但是不要看到 ACM 模式就认为是非常难没办法解决,在这里的 ACM 模式并不一定会达到竞赛级别的难度。
在这里插入图片描述

(1)包含头文件

使用C/C++的同学可以直接使用这个头文件:#include<bits/stdc++.h>,这个文件基本包含了会用到的各种库函数, 以及各种 stl 容器等等。如果

(2)读取数据问题

这种判题模式和接口类型模式测试类似,都是使用预先设置好的测试数据,根据通过的测试文件数量确定学生的得分。只是给了学生更高的自由度,可以按照自己的想法完成程序。题目中会说明输入的格式,比如:第一行两个整数n,m,第二行 n 个整数。这种情况下,我们可以完成这个程序,使用 scanf() 函数和 printf() 函数完成输入输出工作。系统判题时会进行重定向操作,将输入数据输入到程序中,。注意这里不建议使用 cincout 进行输入输出,因为这样可能会使程序变慢。如果实在需要,可以使用 ios::sync_with_stdio(false); 取消 cinstdin 的同步。此外可能还会有一些比较奇怪的输入格式,需要手动处理,比如题目中可能会规定一个二维数组是这样输入的:[[1,2,3],[4,5,6],[7,8,9]],这样就需要读取一个字符串,然后再一点点进行识别处理(或者某些语言的自带函数可以处理)。

(3)多组输入输出问题

这是一个没有做过类似题目的同学很容易遇到的一个问题,就是很有可能遇到多组输入输出的情况。什么是多组输入输出呢,首先先看一下,题目的输入数据和输出文件是这样的。

在这里插入图片描述

我们提交的程序每通过一个测试文件,就可以获得相应的得分。多组输入输出的意思就是,在同一个输入文件中,包含了多组符合要求的输入数据,不同组的输入数据用一个换行符隔开(注意多组输入只是在不同的行,中间只有一个换行符,它们中间一般不会出现空行)。然而对于一个文件中的多组输入,我们的程序一定要保证每一组输入我们计算出来的输出都是正确的,才可以得到这个测试文件的得分。我们的对于多组输入计算得到的多组输出也一定要用换行隔开。那么体现在代码中就是如下的格式:

// 假设我们要计算两个数字a,b的和,输出a+b,多组输入输出
#include<bits/stdc++.h>
using namespace std;
int main(){
    int x, y; 
    while (scanf("%d%d", &x, &y) != EOF) { // 循环输入数据,直到读取到输入文件的截止符为止
        printf("%d\n", a + b); // 这里输出的结果一定要换行,不然在生成的输出文件中,结果数字都会连到一起,无法识别。
    }
    return 0;
}

另外还有一些其他需要注意的技巧,比如:

  • 比如输入不超过 1 0 5 10^5 个数据,那么我们可以开一个 vector 存储,也可以开一个长度为 1 0 5 10^5 长度的数组。因为题目的内存限制一般会在 256M 的级别,所以不用太省空间。
  • 栈空间有一定限制,函数中不能申请太大长度的数组,例如 main 函数里不可以 int a[100052]。
  • 多组输入输出一定要注意每一组都要进行初始化!
  • 并不是每一个题目都是多组输入输出的格式,但是即使不是多组,也可以看成是多组输入输出的一种特例情况,所以当成多组输入输出做是不会出问题的。
(4)判题方式&输出格式问题

简单来说,题目会用考生提交的代码生成程序,再依次输入每一个输入文件,生成对应的输出文件,再和标准的输出文件一个字符一个字符的进行比对,如果完全相同就说明通过了这一组文件的测试。当然这只是简单来说,牛客网的判题系统还会有另外的一些识别功能,如果没有特殊设置,牛客网应该会完成下面的设置:
在这里插入图片描述
但是还是尽量的注意一下格式,总是没有坏处的。好在因为可以多次提交查看判题结果,所以可以及时发现错误进行修改。

3. 判题special judge问题

但是有的情况下,问题的答案可能会不唯一,例如:填数独游戏,有可能就会有多种不同的合法答案,那么我们就不可以简单的比对输出文件和标准答案文件的内容了,这时就需要有一个额外的程序对输出的文件进行判断,看看输出的数独是否满足限制条件,满足则视为答案正确。我们需要知道的就是,如果发现程序可能有多组符合要求的答案,那么就可以看一下题目上是否有special judge标识。
在这里插入图片描述
如果有那么说明确实可能存在多种答案,否则就需要考虑,是否自己忽略了一些限制性条件,比如输出字典序最小的答案等等,再或者就是题目出错了,这个时候点击报错我就会看到了(请不要提交无脑的报错)。

尤其注意,如果输出有浮点类型的数字,那可能为了避免写 spj,会说:输出四舍五入保留小数点后 3 位。也就是:printf("%.3lf\n", ans);

4. 关于错误类型

下面列举几个常见的错误类型,但是注意,因为有多个测试文件,所以如果不是通过,那么只会显示最先遇到的错误类型,比如程序如果大数据超时,小数据错误,那么它如果先发现了小数据答案错误,也就会直接显示小数据错误,而不会显示超时报错。

(1)答案正确

这样就是这道题做对了,可以继续下一题。
在这里插入图片描述

(2)答案错误

输出的结果不对,检查程序的一些部分。
在这里插入图片描述

(3)运行超时

程序运行时间超出了限制,可能是因为死循环或者时间复杂度过高。
在这里插入图片描述

(4)编译错误

程序无法完成编译,下面是报错,也有可能是选错了使用语言。
在这里插入图片描述

(5)段错误

这里注意:数组越界可能不报错,也可能会报段错误,和编译原理有关。如果没发现段错误继续进行有可能会出现答案错误等问题。(玄学问题,经验之谈)
在这里插入图片描述

(6)格式错误

一个好消息,改改格式就能通过。
在这里插入图片描述

发布了227 篇原创文章 · 获赞 142 · 访问量 9万+

猜你喜欢

转载自blog.csdn.net/qq_36306833/article/details/104416578