整数反转
题目
给出一个 32 位的有符号整数,将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
假设环境只能存储 32 位的有符号整数,则其数值范围为 [ − 2 31 , 2 31 − 1 -2^{31},2^{31}-1 −231,231−1]。若在反转后溢出,则返回 0。
解题思路
- 本题需要考虑溢出的问题,可考虑数学计算处理,或者转换字符串进行处理。
- 本篇考虑数学计算的方法处理溢出问题,字符串转换效率相对较低。
- 循环拆开
x
的每一位数字,计算时判断是否溢出。 - 溢出条件,一是大于最大的边界值,二是小于最小的边界值。设当前值为
cur
,下一位拆分的值为pop
- 数值为正,溢出条件
cur * 10 + pop > max_value
- 若
cur > max_value_div_10
时,还需加上pop
则判断溢出 - 若
cur == max_value_div_10
时,pop > 7
则判断为溢出,2^32 - 1
最后一位为7
- 若
- 数值为负,溢出条件
cur * 10 + pop < min_value
- 若
cur < min_value_div_10
时,还需加上pop
判断溢出 - 若
cur == min_value_div_10
时,pop < -8
则判断为溢出,-2^32
最后一位为-8
- 若
- 注意,python 正、负值取余,取模不同于
java
,要加以区分
代码实现
class Solution:
def reverse(self, x: int) -> int:
'''反转整数
Args:
int: 传入待反转的整数
Returns:
返回反转后的整数
'''
# 存储返回值
cur = 0
# 边界值除以 10,用于后续判断是否溢出
max_value_div_10 = (1<<31) // 10
min_value_div_10 = -(-((1<<31)-1) // -10)
while x != 0:
# Python 正、负值取模,取余有区别,需分开判断
if x > 0:
pop = x % 10
x //= 10
else:
pop = x % -10
x = -(x // -10)
# 若 cur > max_value_div_10 时,还需加上 pop 则判断溢出
# 若 cur == max_value_div_10 时,pop > 7 则判断为溢出,2^32 - 1 最后一位为 7
if (cur > (max_value_div_10)) or ((cur == (max_value_div_10)) and (pop > 7)):
return 0
# 若 cur < min_value_div_10 时,还需加上 pop 判断溢出
# 若 cur == min_value_div_10 时,pop < -8 则判断为溢出,-2^32 最后一位为 -8
if (cur < (min_value_div_10)) or ((cur == (min_value_div_10)) and (pop < -8)):
return 0
cur = cur * 10 + pop
return cur
实现效果
以上为本篇的主要内容。