跳到主要内容

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 的字符串处理不受限制,始终安全。

相关题目

加载评论中...