输入输出

4 阅读4分钟

牛客网的 OJ(Online Judge)在线编程常见输入输出练习,共18题。这是算法笔试/面试中最基础的环节,掌握这些模板非常重要。

由于题目数量较多,我为你整理了 Python (ACM 模式) 的完整解法。为了方便阅读,我将题目按输入输出模式进行了分类讲解。

📌 核心知识点总结

  1. 读取输入: 通常使用 sys.stdininput()
  2. 多组输入判断: Python 没有像 Java 那样的 hasNext,通常通过 try-except 捕获 EOF(文件结束)来判断,或者根据题目给定的循环次数 t 来循环。
  3. 数据类型转换: 输入的是字符串,计算前通常需要 int()float() 转换。

1. 基础字符串与单次输入

对应题目:1, 2

第1题:只有输出

# 直接打印即可
print("Hello Nowcoder!")

第2题:单组 A+B

import sys
for line in sys.stdin:
    # 拆分每一行的数字
    a, b = map(int, line.split())
    print(a + b)
    break # 因为是单组,读一行就结束。或者不用break,靠输入结束退出。

或者更简单的写法:

a, b = map(int, input().split())
print(a + b)

2. 多组输入(循环处理)

对应题目:3, 4, 5

第3题:多组 A+B (EOF形式)

  • 难点: 不知道有多少组数据,读到文件末尾(EOF)停止。
  • Python解法: 使用 try-except 捕获 EOFError
import sys
try:
    for line in sys.stdin:
        a, b = map(int, line.split())
        print(a + b)
except:
    pass

或者:

while True:
    try:
        a, b = map(int, input().split())
        print(a + b)
    except EOFError: # 或者直接 except:
        break

第4题:多组 A+B (T组形式)

  • 特点: 第一行给出数据组数 t,然后循环 t 次。
t = int(input())
for _ in range(t):
    a, b = map(int, input().split())
    print(a + b)

第5题:多组 A+B (零尾模式)

  • 特点: 一直读,直到读到 0 0 为止。
while True:
    line = input().strip()
    a, b = map(int, line.split())
    if a == 0 and b == 0:
        break
    print(a + b)

3. 一维数组处理

对应题目:6, 7

第6题:单组_一维数组求和

n = int(input())
# 读取第二行,按空格分割并转为整数列表
nums = list(map(int, input().split()))
print(sum(nums))

第7题:多组_一维数组 (T组形式)

t = int(input())
for _ in range(t):
    n = int(input())
    nums = list(map(int, input().split()))
    print(sum(nums))

4. 二维数组处理

对应题目:8, 9

第8题:单组_二维数组求和

# 读取行数n和列数m
n, m = map(int, input().split())

total = 0
for i in range(n):
    # 读取每一行
    row = list(map(int, input().split()))
    total += sum(row)
print(total)

第9题:多组_二维数组 (T组形式)

t = int(input())
for _ in range(t):
    n, m = map(int, input().split())
    total = 0
    for i in range(n):
        row = list(map(int, input().split()))
        total += sum(row)
    print(total)

5. 字符串处理

对应题目:10, 11, 12, 13

第10题:单组_字符串倒置

n = int(input())
s = input().strip()
# Python切片倒置 [start:end:step],-1代表逆序
print(s[::-1])

第11题:多组_字符串倒置 (T组形式)

t = int(input())
for _ in range(t):
    n = int(input())
    s = input().strip()
    print(s[::-1])

第12题:单组_二维字符数组 (行列倒置)

  • 注意: 题目要求行和列都倒置(即整个矩阵旋转180度)。
n, m = map(int, input().split())
matrix = []
for i in range(n):
    matrix.append(input().strip())

# 先按行倒序,再按列倒序
for i in range(n-1, -1, -1): # 从最后一行遍历到第一行
    # 将该行字符串倒置后打印
    print(matrix[i][::-1])

第13题:多组_带空格的字符串 (去空格倒置)

  • 注意: 先去掉空格,再倒置。
t = int(input())
for _ in range(t):
    n = int(input())
    s = input().strip()
    # 去掉所有空格
    no_space = s.replace(" ", "")
    # 倒置
    print(no_space[::-1])

6. 格式化输出与特殊判断

对应题目:14, 15, 16, 17, 18

第14题:保留3位小数

n = float(input())
# 格式化输出:.3f 代表保留3位小数,自动四舍五入
print(f"{n:.3f}")

第15题:补充前导零 (9位)

n = int(input())
# zfill(width) 方法:补零填充到指定位数
# 或者用格式化:print(f"{n:09d}")
print(str(n).zfill(9))

第16题:奇偶判断 (YES/NO)

n = int(input())
if n % 2 == 1: # 奇数
    print("YES")
else:
    print("NO")

第17题:浮点数误差判断 (圆面积)

import math
r = int(input())
area = math.pi * r * r
# 保留足够的小数位以满足精度要求
print(f"{area:.6f}") # 通常保留6位以上即可通过误差检测

第18题:构造数组 (和为m)

n, m = map(int, input().split())
# 构造 n-1 个 1
result = [1] * (n - 1)
# 最后一个数为剩下的值
result.append(m - (n - 1))
# 输出结果,用空格连接
print(" ".join(map(str, result)))

💡 常用 Python OJ 模板速查

需求Python 代码模板
读取一行整数list(map(int, input().split()))
字符串倒置s[::-1]
补前导零str(num).zfill(9)f"{num:09d}"
保留3位小数print(f"{num:.3f}")
EOF多组循环while True: try: ... except: break
多组指定次数t = int(input()); for _ in range(t): ...