23年OPPO-a的翻转
2026/10/24约 866 字大约 3 分钟
23年OPPO-a的翻转
OPPO 笔试真题 · 2023 秋招 · 研发岗
判题请到牛客原题提交。
题目描述
数字翻转数位得到数字,计算。
输入格式
一个正整数。保证在十进制下每一位都非。
输出格式
一个正整数表示答案。
示例
示例 1
输入:
12输出:
33说明:
正整数,翻转得到,。
示例 2
输入:
23输出:
55解题思路
第一步:理解问题本质
「翻转数位」不是把数字取反,也不是二进制翻转,而是把十进制的写法倒过来读:12345 翻转后是 54321。所以题目要的就是 a + reverse(a)。
第二步:怎么实现翻转
两种写法完全等价:
- 数学写法:反复取
a % 10拿到当前个位,b = b * 10 + 个位,再a //= 10,直到a为 0。 - 字符串写法:
str(a)[::-1]把写法倒过来,再int(...)转回数字。
字符串写法更短也更好读。题面保证每一位都非 0,所以倒着写不会出现前导零,
两种写法得到的结果一致。
第三步:相加并确认范围
a ≤ 10^9,翻转后的 b 位数与 a 相同,和不超过 2 × 10^9。
Python 的整数不会溢出;换成 C++ 时用 long long 更稳妥。
完整代码实现
import sys
def solve() -> None:
"""把 a 的数位翻转得到 b,输出 a + b"""
data = sys.stdin.read().split()
if not data:
return
a = int(data[0])
# 数位翻转:字符串反转后转回整数
b = int(str(a)[::-1])
sys.stdout.write(str(a + b) + "\n")
if __name__ == "__main__":
solve()示例推演
以示例 1 的 a = 12 为例:
| 步骤 | 值 |
|---|---|
| 读入 a | 12 |
| 转成字符串 | "12" |
| 反转字符串 | "21" |
| 转回整数得到 b | 21 |
| 输出 a + b | 33 |
示例 2 的 a = 23:反转得到 32,23 + 32 = 55。
再看一个多位的 a = 12345:反转得到 54321,12345 + 54321 = 66666。
复杂度分析
| 解法 | 时间复杂度 | 空间复杂度 | 说明 |
|---|---|---|---|
| 字符串反转 | O(d) | O(d) | d 为位数,实现最简,推荐 |
| 数学取余 | O(d) | O(1) | 不占额外空间 |
易错点总结
1. 反转后忘了转回整数
str(a)[::-1] 是字符串。直接和整数相加会报类型错误;
若写成 str(a) + str(a)[::-1],得到的是 "1221" 这样的拼接结果,而不是 33。
2. 担心前导零
题面明确写了「每一位都非 0」,所以不会出现 120 → 021 这种情况。
即使出现,int("021") 也会自动得到 21,结果依然正确。
3. 读输入时把整行当成数字
输入只有一个正整数,用 sys.stdin.read().split() 取第一个 token 即可,
不要假设后面还有别的内容。
扩展思考
- 如果
a允许含 0,翻转后的前导零会被int自动去掉,120 + 21 = 141仍然正确;
只有要求「保留前导零输出」时才需要另行处理。 - 把「十进制翻转」换成「二进制翻转并去掉前导 0」,就是小O的数位翻转 里的操作。
- 回文数判断也是同一个动作:翻转后与自己比较是否相等。