关于互联网大厂在线笔试编程题的输入输出问题

背景描述

2023年7月22日,本人第一次参加互联网公司的在线笔试,是小红书的提前批笔试,笔试内容是在赛码网上进行的,编程题一共有3道,第一道个人觉得逻辑和代码是没有问题的,但是提交以后都只答对了9%,所以直接影响了后面的两道编程题的解答。

由于是第一次参加这种类型的考试,确实是对答题环境缺少必要的了解,应该错误就出在输入输出上。以前在leetcode上刷过几次题,但是leetcode上是不需要处理输入输出的,直接写好对应的函数或类即可,如下图所示。但是在线测试平台上的环境不是这样的,所以在此梳理一下,提供给所有第一次参与互联网在线测试的同学做参考。
leetcode中的代码调试界面
但是,以赛码网为例,在你写完代码以后,他的提交界面是这样的:
在这里插入图片描述
上述两者的区别就在于:

  1. leetcode的后台会自动帮你把输入数据转换成了函数的参数,所以不需要我们自己亲自去写一个有关输入和输出的函数,而在线判题系统不会;

  2. leetcode每次都会给出错误的测试用例,所以我们每次都可以按照错误的用例来进行针对性的调试,这样很快就能够找到bug,但是机考的在线系统是不会给出这样的测试用例的,所以可以看到他是支持我们自己写测试用例的,或者自己检查代码的逻辑,这也算是对我们编程能力的考察。

所以像leetcode,剑指offer这种形式的在线编程网站确实可以很好的帮助我们快速提高对算法的理解和掌幄,用来学习是非常好的,但是若要在机考上快速提高测试并通过,还是要对传统的在线机考测试做针对性的练习。

笔试网站简介

在收到笔试邀请之后,一定首先了解一下面试企业将要采取的是什么平台对你进行在线编程测试。
因为每一个平台的代码输入输出规则是不一样的。一般企业会用到以下几个平台:

  1. 牛客网:腾讯、美团等大中小厂;
  2. 赛码网:360、顺丰、字节和小红书等大中小厂;
  3. 其他小平台或自建平台:阿里等

一般企业都是选择前两个比较大的平台作为笔试的合作方,所以后面我会重点对这两个平台下的一些规则进行梳理。

该类在线测试系统也被称为 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 赛制:最不刺激的赛制,比赛时可以看到结果,计分按照这道题目的

1. 赛码网

1.1 输入也是一个简单的算法

其实,如何写输入也是一个简单的算法,需要同学根据题目描述和输入描述,用程序算法把这些描述准确地模拟出来,以下面这道题目为例:

题目描述:
大学的同学来自全国各地,对于远离家乡步入陌生大学校园的大一新生来说,碰到老乡是多么激动的一件事,于是大家都热衷于问身边的同学是否与自己同乡,来自新疆的小赛尤其热衷。但是大家都不告诉小赛他们来自哪里,只是说与谁是不是同乡,从所给的信息中,你能告诉小赛有多少人确定是她的同乡吗?

输入描述:
包含多组测试用例。
对于每组测试用例:
第一行包括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(N1)/2),代表现有 N N N 个人(用 1 ∼ N 1 \sim N 1N 编号)和 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))

上述代码都是简单的对测试样例的输入和输出进行展示,不包含算法部分的代码。

1.2 各种输入输出的情况总结

python 语言中的输入一般使用 input()sys.stdin.readline,一般使用前者即可,使用 print() 进行输出。

1.2.1 单个输入,单个输出
input = int(input())
output = input
print(str(output))
1.2.2 单行多个输入,单行多个输出,空格分割(多行输入,每一行是一个测试样例)
inputs = list(map(int, input().split(" ")))
m, n = inputs[0], input[1]
print(str(m), str(n))
1.2.3 多个测试案例,每个测试案例多行
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系统的输入输出相关的注意事项,请见链接

事实证明,赛码网的在线判题系统还存在诸多的坑,比如可以参考链接

2. 牛客网

牛客网建议使用 sys.stdin.readline() 获取输入,使用 print() 进行输出。
输入用空格隔开,如果要用 , 隔开,使用 .split(",")

2.1 多行输入,每一行是一个测试样例

import sys 
for line in sys.stdin:
    a = line.split()
    print(int(a[0]) + int(a[1]))

2.2 多个测试用例,每个测试用例有多行

输入包含多组测试用例。对于每组测试用例:第一行包含两个整数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)

参考资料

  1. 初识 OI 和 OJ:https://www.jianshu.com/p/eac3c4d078b7
  2. OJ的输入输出详细讲解: https://discuss.acmcoder.com/topic/5d47dfa8b99ad44605a1700b
  • 9
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
互联网大厂Java工程师面试题.pdf》是一份面试题集合,主要用于考察Java工程师的技术水平和编程能力。这份面试题可能涵盖了Java基础知识、面向对象编程、多线程与并发、网络编程、数据库操作等方面的内容。 在面对这份面试题时,Java工程师需要对Java语言的特性和使用有深入的了解,能够熟练使用Java的各种关键字、数据类型、流程控制语句等。此外,还需要了解Java的面向对象编程思想,熟悉封装、继承、多态等概念,并能够运用这些知识进行编程。 同时,Java工程师还需要对多线程与并发编程有一定的了解,知道如何创建和管理线程、同步和互斥等操作,以及如何处理线程安全的问题。 在网络编程方面,Java工程师需要掌握Socket编程、HTTP协议等知识,能够实现客户端和服务器之间的数据交互。 对于数据库操作,Java工程师需要熟悉SQL语言,能够运用JDBC等技术与数据库进行交互,实现数据的增删改查等常见操作。 在回答这些面试题时,Java工程师需要清晰、准确地表达自己的思路和解决方案,并且能够合理地优化代码,具备较强的编程和逻辑思维能力。 最后,Java工程师还需要注重实践和项目经验的积累,在实际的开发项目中不断学习和实践,提升自己的技术水平。同时,要关注行业的最新动态,并积极参与学习和交流,保持对新技术的敏感度和学习能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值