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
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输入输出训练场上进行测试,代码风格无绝对,好用即可。如果大家有什么疑问的话可以留言,我看到就会回复。标准输入简单了解一下即可,前面介绍的并不深入,实际上完成基本的笔试上面的框架足够,并且一般在笔试的时候,都会有例题让我们了解如何进行数据的获取。
欢迎转载,但是请注名出处~