牛客网笔试输入输出处理方法总结(基于Python3.5)

牛客网判题系统输入处理


牛客网上的输入输出借鉴ACM模式给出,对于习惯了leetcode函数定义形式解题的小伙伴们来说确实比较生疏。为了避免在之后的笔试中再次吃亏,在这里对牛客网输入输出的处理方法做一个总结。

单行输入

对于Python3,有两种常用方式读取单行,获得的一般是整行作为字符串序列,有时需要处理以数字或字符的形式保存。

# 输入5 7 9
import sys
line = sys.stdin.readline().strip()   # 方法一:.strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)    
line = input()           # 方法二,二者选一即可
intputs = line.split()   # 默认以空格分隔
print(type(line))     # 输出<class 'str'> 
print(line)           # 输出5 7 9
print(inputs)         # 输出['5', '7', '9']

单行输入时也会面临许多组测试样例输入的情况,因此一样需要循环读取。注意输入输出都要写道循环中。

  1. 计算a+b。输入包括两个正整数a,b(1 <= a, b <= 10^9),输入数据包括多组。输出a+b的结果。
while True:
    try:
        a, b = map(int,input().split())
        print(a+b)
    except:
        break
'''
import sys 
for line in sys.stdin:     # 这个循环等价于while True: line = sys.stdin.readline() 或 while True: line = input(),读取的是字符串
    a = line.split()       # 切分后得到单个字符串元素组成的列表,后续有时还要将元素从字符串转化为数字格式来完成运算
    print(int(a[0]) + int(a[1]))     # 输出不用return而是直接print
'''

多行输入

多行输入时,记得每个input()或sys.stdin.readline().strip()都是读取一行的字符串输入,此外还需要考虑系统可能会输入多组样例来对程序进行测试,因此有时需要多加一层循环。看下列例题:

  1. 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
    具体要求:输入包括多组测试数据。
    每组输入第一行是两个正整数N和M(0 < N <= 30000,0 < M < 5000),分别代表学生的数目和操作的数目。学生ID编号从1编到N。
    第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
    接下来又有M行,每一行有一个字符C(只取‘Q’或‘U’),和两个正整数A,B,当C为'Q'的时候, 表示这是一条询问操作,他询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
    当C为‘U’的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
import sys
try:               
    while True:          # try-except和while True的意义是读取输入的每组样例,由于样例组数未知,因此这样处理,也可以交换while与try的位置。外循环读取多组样例。
        N, M = map(int, sys.stdin.readline().strip().split())   # 读取第一行,map用于对迭代器中的元素分别使用int函数进行类型转换
        grades = list(map(int, input().split()))     # 读取第二行
        for i in range(M):                           # 读取该样例后面的M行,有时样例中不会预先给出行数,这时候也需要仿照外层利用while循环解决。内循环读取单个样例中的多行数据。
            command = input().split()
            '''
            中间解题和输出部分省略。。注意可以读一行处理完后输出一行,而不必全部读取后统一输出
            '''
except:
    pass
  1. 计算a+b。输入第一行包括一个数据组数t,接下来每行包括两个正整数a,b。输出a+b的结果。
while True:
    try:
        num = int(input())
        for i in range(num):
            a, b = map(int,input().split())
            print(a+b)
    except:
        break

参考资料:

  1. https://www.nowcoder.com/discuss/276 牛客网在线判题系统使用帮助
  2. https://www.nowcoder.com/test/question/3897c2bcc87943ed98d8e0b9e18c4666?pid=260145&tid=36773294 华为2016校园招聘上机笔试题
posted @ 2022-08-21 11:13  刘国栋_0017  阅读(2405)  评论(0编辑  收藏  举报