牛客网笔试输入输出处理方法总结(基于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']
单行输入时也会面临许多组测试样例输入的情况,因此一样需要循环读取。注意输入输出都要写道循环中。
- 计算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()都是读取一行的字符串输入,此外还需要考虑系统可能会输入多组样例来对程序进行测试,因此有时需要多加一层循环。看下列例题:
- 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
具体要求:输入包括多组测试数据。
每组输入第一行是两个正整数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
- 计算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
参考资料: