HJ11. 数字颠倒
题目描述
输入一个整数,以字符串形式逆序输出。程序不考虑负数的情况; 若数字末尾含 0,逆序之后也需要含 0,如输入 100,输出 001。
输入格式
在一行上输入一个非负整数。
输出格式
在一行上输出一个字符串,代表颠倒后的数字。
示例
示例 1
输入:
1516000
输出:
0006151
示例 2
输入:
0
输出:
0
解题思路
第一步:理解问题本质
题目要求将数字作为字符串处理并逆序。关键点是:保留前导零。例如 100 逆序后是 001,不是 1。
这意味着不能简单地将输入转为整数再处理(因为整数不会保留前导零),必须始终按字符串操作。
第二步:最优解法 —— 字符串切片
Python 字符串切片 [::-1] 是最简洁的逆序方式:
def reverse_number(num_str: str) -> str:
return num_str[::-1]
执行过程:"1516000"[::-1] → 从末尾到开头取所有字符 → "0006151"
第三步:替代写法 —— reversed() 函数
def reverse_number(num_str: str) -> str:
return ''.join(reversed(num_str))
两种方法时间复杂度都是 O(n),空间复杂度都是 O(n)。
完整代码实现
import sys
def reverse_number(num_str: str) -> str:
"""字符串切片逆序"""
return num_str[::-1]
if __name__ == "__main__":
for line in sys.stdin:
s = line.strip()
if s:
print(reverse_number(s))
示例推演
以输入 1516000 为例:
步骤:字符串 "1516000" 逆序读取每个字符:
| 原索引 | 原字符 | 新索引 | 说明 |
|---|---|---|---|
| 6 | '0' | 0 | 末尾的0移到开头 |
| 5 | '0' | 1 | |
| 4 | '0' | 2 | |
| 3 | '6' | 3 | |
| 2 | '1' | 4 | |
| 1 | '5' | 5 | |
| 0 | '1' | 6 | 开头的1移到末尾 |
结果:"0006151"
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 切片法 | O(n) | O(n) | 最简洁,一行代码 |
| reversed() | O(n) | O(n) | 可读性好 |
n 为字符串长度
易错点总结
1. 先转整数再处理
# 错误!会丢失前导零
n = int("100") # n = 100
result = str(n)[::-1] # "001" → 但这里 n 是 100,不是 "100"
解决:直接对字符串操作,不要先转整数。
2. 负数处理
题目说明"不考虑负数的情况",所以无需处理 - 号。如果题目要求处理负数,需要特殊处理:
if num_str.startswith('-'):
return '-' + num_str[:0:-1] # 去掉负号后逆序,再拼接负号
3. 空输入
使用 if s: 判断避免处理空行。
扩展思考
- 如何只反转数字而保持符号在首位? 分离符号和数字部分分别处理。
- 数学取余法是否可行? 如果先转整数会丢失前导零,不适合本题。
- 如果数字非常大(超过64位)? Python 的字符串处理不受限制,始终安全。