赞
踩
2023年7月22日,本人第一次参加互联网公司的在线笔试,是小红书的提前批笔试,笔试内容是在赛码网上进行的,编程题一共有3道,第一道个人觉得逻辑和代码是没有问题的,但是提交以后都只答对了9%,所以直接影响了后面的两道编程题的解答。
由于是第一次参加这种类型的考试,确实是对答题环境缺少必要的了解,应该错误就出在输入输出上。以前在leetcode上刷过几次题,但是leetcode上是不需要处理输入输出的,直接写好对应的函数或类即可,如下图所示。但是在线测试平台上的环境不是这样的,所以在此梳理一下,提供给所有第一次参与互联网在线测试的同学做参考。
但是,以赛码网为例,在你写完代码以后,他的提交界面是这样的:
上述两者的区别就在于:
leetcode的后台会自动帮你把输入数据转换成了函数的参数,所以不需要我们自己亲自去写一个有关输入和输出的函数,而在线判题系统不会;
leetcode每次都会给出错误的测试用例,所以我们每次都可以按照错误的用例来进行针对性的调试,这样很快就能够找到bug,但是机考的在线系统是不会给出这样的测试用例的,所以可以看到他是支持我们自己写测试用例的,或者自己检查代码的逻辑,这也算是对我们编程能力的考察。
所以像leetcode,剑指offer这种形式的在线编程网站确实可以很好的帮助我们快速提高对算法的理解和掌幄,用来学习是非常好的,但是若要在机考上快速提高测试并通过,还是要对传统的在线机考测试做针对性的练习。
在收到笔试邀请之后,一定首先了解一下面试企业将要采取的是什么平台对你进行在线编程测试。
因为每一个平台的代码输入输出规则是不一样的。一般企业会用到以下几个平台:
一般企业都是选择前两个比较大的平台作为笔试的合作方,所以后面我会重点对这两个平台下的一些规则进行梳理。
该类在线测试系统也被称为 OJ (Online Judge),即在线判题系统,是一种在编程竞赛中用来测试参赛程序的在线系统,也可以用于平时练习。关于该系统也有一些专业的术语和规则,如:
判题时经常会出现的评测状态有:
题目状态:
AC:Accept,程序通过。
CE:Compile Error,编译错误。
PC:Partially Correct,部分正确。
WA:Wrong Answer,答案错误。
RE:Runtime Error,运行时错误。
TLE:Time Limit Exceeded,超出时间限制。
MLE:Memory Limit Exceeded,超出内存限制。
OLE:Output Limit Exceeded,输出超过限制。
UKE:Unknown Error,出现未知错误。
赛制:
OI 赛制:传统的赛制,比赛期间不能看到结果。以最后一次提交为准。
ACM 赛制:比赛时可以看到结果,必须 AC 了这道题目才会计分,会记录AC 这道题的耗时,每次失败的提交会加上 20 分钟的罚时。通过题目数多的排名在前;通过数一样的耗时少排名靠前。
乐多赛制:洛谷网站独创赛制。结合了 OI 赛制和 ACM 赛制的优点,既可以按照题目的测试点分点得分,也不失比赛的刺激。比赛时可以看到结果。对于一道题的得分,计算为(评测得分*0.95^(本题提交次数-1)),最低扣到原来的 70% 为止。
IOI 赛制:最不刺激的赛制,比赛时可以看到结果,计分按照这道题目的
其实,如何写输入也是一个简单的算法,需要同学根据题目描述和输入描述,用程序算法把这些描述准确地模拟出来,以下面这道题目为例:
题目描述:
大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁是不是同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?
输入描述:
包含多组测试用例。
对于每组测试用例:
第一行包括2个整数,
N
(
1
<
=
N
<
=
1000
)
N(1 <= N <= 1000)
N(1<=N<=1000),
M
(
0
<
=
M
<
=
N
∗
(
N
−
1
)
/
2
)
M(0 <= M <= N*(N-1)/2)
M(0<=M<=N∗(N−1)/2),代表现有
N
N
N 个人(用
1
∼
N
1 \sim N
1∼N 编号)和
M
M
M 组关系;
在接下来的
M
M
M 行里,每行包括3个整数,
a
a
a,
b
b
b,
c
c
c,如果
c
c
c 为1,则代表
a
a
a 跟
b
b
b 是同乡;如果
c
c
c 为0,则代表
a
a
a 跟
b
b
b 不是同乡;
已知1表示小赛本人。
输入样例:
3 1
2 3 1
5 4
1 2 1
3 4 0
2 5 1
3 2 1
所以要是我看到这个问题描述,直接就蒙了,我就会误以为,输入跟我没关系,默认每个输入就是一个测试用例,所以上面的输入样例中,是包含两个测试样例的,第1-2行和第3-7行。
但是实际上这样是错误的,不仅需要对上述输入样例自定义代码进行读取,还需要注意的一点是,一般来讲题目中不会告诉你有多少组测试样例,所以是需要写一个循环,读取所有的测试样例的。请看相关解答的示例代码如下:
// C #include <stdio.h> int main() { int N, M; // 每组第一行是2个整数,N和M,至于为啥用while,因为是多组。 while(scanf("%d %d", &N, &M) != EOF) { printf("%d %d\n", N, M); // 循环读取“接下来的M行” for (int i=0; i<M; i++) { int a, b, c; // 每行是3个整数,a,b,c。 scanf("%d %d %d", &a, &b, &c); printf("%d %d %d\n", a, b, c); } // M行读取完了,就又要开始下一组了,去while那里。 } }
// Javascript
var N, M;
// 每组第一行是2个整数,N和M,至于为啥用while,因为是多组。
while ((N=readInt()) != null && (M=readInt()) != null) {
print (N + ' ' + M);
// 循环读取“接下来的M行”
for (let i=0; i<M; i++) {
let a = readInt();
let b = readInt();
let c = readInt();
// 每行是3个整数,a,b,c。
print(a + ' ' + b + ' ' + c);
}
// M行读取完了,就又要开始下一组了,去while那里。
}
#!/usr/bin/env python # coding=utf-8 # Python使用的是3.4.3,缩进可以使用tab、4个空格或2个空格,但是只能任选其中一种,不能多种混用 import math while 1: # 每一次循环针对一个测试样例 #每组第一行是N和M nm = list(map(int,input().split(" "))) # 每一个input()函数都针对一行输入 N = nm[0] M = nm[1] print(str(N) + ' ' + str(M)) # 接下来M行,每行a b c for i in range(M): abc = list(map(int,input().split(" "))) # 这里就针对除第一行输入外的其他行的输入 a = abc[0] b = abc[1] c = abc[2] print(str(a) + ' ' + str(b) + ' ' + str(c))
上述代码都是简单的对测试样例的输入和输出进行展示,不包含算法部分的代码。
python
语言中的输入一般使用 input()
或 sys.stdin.readline
,一般使用前者即可,使用 print()
进行输出。
input = int(input())
output = input
print(str(output))
inputs = list(map(int, input().split(" ")))
m, n = inputs[0], input[1]
print(str(m), str(n))
while 1:
nm = list(map(int,input().split(" ")))
N = nm[0]
M = nm[1]
print(str(n)+' '+str(m))
for i in range(m):
abc = list(map(int, input().split(" ")))
a, b, c = abc[0], abc[1], abc[2]
print(str(a)+' '+str(b)+' '+str(c))
更多与赛码网上的OJ系统的输入输出相关的注意事项,请见链接
事实证明,赛码网的在线判题系统还存在诸多的坑,比如可以参考链接
牛客网建议使用 sys.stdin.readline()
获取输入,使用 print()
进行输出。
输入用空格隔开,如果要用 ,
隔开,使用 .split(",")
import sys
for line in sys.stdin:
a = line.split()
print(int(a[0]) + int(a[1]))
输入包含多组测试用例。对于每组测试用例:第一行包含两个整数N和M,在接下来的M行内,每行包括3个整数。要求按照输入格式输出。
import sys
for line in sys.stdin:
n, m = map(int, line.strip().split())
print(n, m)
for i in range(m):
for line in sys.stdin:
a, b, c = map(int, line.strip().split())
print(a, b, c)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。