牛客网的 OJ(Online Judge)在线编程常见输入输出练习,共18题。这是算法笔试/面试中最基础的环节,掌握这些模板非常重要。
由于题目数量较多,我为你整理了 Python (ACM 模式) 的完整解法。为了方便阅读,我将题目按输入输出模式进行了分类讲解。
📌 核心知识点总结
- 读取输入: 通常使用
sys.stdin或input()。 - 多组输入判断: Python 没有像 Java 那样的
hasNext,通常通过try-except捕获 EOF(文件结束)来判断,或者根据题目给定的循环次数t来循环。 - 数据类型转换: 输入的是字符串,计算前通常需要
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): ... |