牛客网OJ训练,如何读取未知行的输入数据

OJ在线编程常见输入输出练习 前言一、python的标准输入输出二、训练实例1.A + B(1)2.A + B(2)3.A + B(3)4.A + B(4)5

OJ在线编程常见输入输出练习

  • 前言
  • 一、python的标准输入输出
  • 二、训练实例
    • 1.A + B(1)
    • 2.A + B(2)
    • 3.A + B(3)
    • 4.A + B(4)
    • 5.A + B(5)
    • 6.A + B(6)
    • 7.A + B(7)
    • 8.字符串排序(1)
    • 9.字符串排序(2)
    • 10.字符串排序(3)
  • 三、总结


前言

牛客网的输入输出总是让我们很困惑,所以我们今天来聊一聊到底应该如何处理这些输入输出。以下实例均出自牛客网OJ训练场,我是用python完成下面训练,旨在说明如何用python读取固定或非固定长度的输入。
代码基于python3实现, 训练场链接如下:牛客网OJ训练场


一、python的标准输入输出

python的标准输入输出需要导入sys包,类似于c语言的#include或c++的#include。

import sys

在python中,需要使用

sys.stdin.readline()  # 同时还有read readlines函数

读入一行数据,类似于C的scanf函数或者C++的cin函数,readline读入用户输入的一行数据,通常以换行符作为结束。readline读入数据后,尾部是包含\n字符,需要手动去除。

  1 import sys2 3 data = sys.stdin.readline()4 sys.stdout.write(data + " " + "lenght is " + str(len(data)) + "\n")5 # print(data, "length is ", len(data))

代码实际输出如下(print打印的)
代码输出
可以看出尾部包含了换行符,使用 strip() 函数可以去掉头尾的空格或换行符。标注输入的默认格式都是字符串形式,标准输出sys.stdout.write(arg1)将数据打印到控制台,print()函数也是在标准输出的基础上实现的。
标准输入还有两种实现:raw_input()和input()函数。
raw_input()函数是python2中的数据读取的一种方式,同时也提供input()函数,可以对输入的表达式进行计算。在python3中只提供input()函数读取用户输入的一行数据,input()使用起来要比stdin更加便捷,使用input()函数读入的数据不包含末尾换行符,可以简单理解i为nput()读入用户一行数据且无需额外调用strip()函数。
简单了解上面一些知识,即可顺利完成牛客网的OJ训练。下面开始进入正式训练阶段。

二、训练实例

1.A + B(1)

我这里直接截图进行说明,不打字了,偷懒一下下~
说明
代码如下:

import sys
res = []
try:while True:data = [int(e) for e in input().split(' ')]res.append(sum(data))
except:for r in res:print(r)

这道题的输入是不固定的,因此上述代码可以直接套用实际的面试题,读取未知长度输入数据。代码风格因人而异,如果大家有疑问可以先尝试,然后留言告诉我哈。

2.A + B(2)

题目如下图所示。
说明
代码如下:

import sys
line = int(input())
res = []
for i in range(line):data = [int(e) for e in input().split(' ')]res.append(sum(data))
for r in res:print(r)

这道题已知输入数据的长度,因此我们可以直接使用for循环来进行数据处理。

3.A + B(3)

题目如下图所示。
说明
代码如下:

import sysres = []
while True:data = [int(e) for e in input().split(' ')]if data[0] == 0 and data[1] == 0:breakres.append(sum(data))
for r in res:print(r)

这道题虽然不知道长度,但是明确给出了输入数据的截止条件,所以我们可以直接使用while循环进行数据处理,只要确定循环终止条件即可。

4.A + B(4)

题目如下图所示。
说明
代码如下:

import sys res = []
while True:data = [int(e) for e in input().split(' ')]if data[0] == 0:breakres.append(sum(data[1:]))for r in res:print(r)

这道题和上一道解法相同,只需要确定循环终止条件即可。

5.A + B(5)

题目如下图所示。
说明
代码如下:

import syslines = int(input())
res = []
for i in range(lines):data = [int(e) for e in input().split(' ')]res.append(sum(data[1:]))for r in res:print(r)

这道题还是事先说明了输入数据的函数,先使用一个input函数获取输入数据的行数,然后使用for循环进行数据处理。

6.A + B(6)

题目如下图所示。
说明

代码如下:

import sys
res = []
try:while True:data = [int(e) for e in input().split(' ')]res.append(sum(data[1:]))
except:for r in res:print(r)

处理逻辑相同,注意数据的切分,数据行的第一个元素是数据的长度。

7.A + B(7)

题目如下图所示。
说明
代码如下:

import sysres = []
try:while True:data = [int(e) for e in input().split(' ')]res.append(sum(data))
except:for r in res:print(r)

相同逻辑,不多说。

8.字符串排序(1)

题目如下图所示。
说明
代码如下:

import syslens = input()
data = input().split(' ')
data.sort(reverse=False)
res = data[0]
for d in data[1:]:res = res + ' ' + d
print(res)

直接使用sort排序,然后将输出指定为要求的格式。

9.字符串排序(2)

题目如下图所示。
说明
代码如下:

import sysres = []
try:while True:data = input().split(' ')data.sort(reverse=False)s = data[0]for d in data[1: ]:s = s + ' ' + dres.append(s)
except:for r in res:print(r)

未知长度的输入数据处理,直接使用try while except框架,注意输出格式即可。

10.字符串排序(3)

题目如下图所示。
说明
代码如下:

import sys res = []
try:while True:data = input().split(',')data.sort(reverse=False)s = data[0]for d in data[1:]:s = s + ',' + d res.append(s)
except:for r in res:print(r)

代码逻辑和前面的相同,不多言。

三、总结

上述练习均在牛客网OJ输入输出训练场上进行测试,代码风格无绝对,好用即可。如果大家有什么疑问的话可以留言,我看到就会回复。标准输入简单了解一下即可,前面介绍的并不深入,实际上完成基本的笔试上面的框架足够,并且一般在笔试的时候,都会有例题让我们了解如何进行数据的获取。

欢迎转载,但是请注名出处~