题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
- -231 <= x <= 231 - 1
思路
算法:
循环 O(logn)
依次从右往左计算出每位数字,然后逆序累加在一个整数中。可用秦九韶算法
另外,需要注意:
- 在C++中,负数的取模运算和数学意义上的取模运算不同,结果还是负数,比如 −12%10=−2,所以我们不需要对负数进行额外处理。
时间复杂度:一共有 O(logn) 位,对于每一位的计算量是常数级的,所以总时间复杂度是 O(logn).
代码
C++代码:
class Solution {
public int reverse(int x) {
int res = 0;
while (x != 0){
// 溢出判断
if (res > 0 && res > (Integer.MAX_VALUE - x % 10) / 10) return 0;
if (res < 0 && res < (Integer.MIN_VALUE - x % 10) / 10) return 0;
// 把每一位抠出来,倒置
res = res * 10 + x % 10;
// 除去最后一位
x /= 10;
}
return res;
}
}
python3代码:
class Solution:
def reverse(self, x: int) -> int:
s = str(x)
res = 0
if x < 0:
x = s[1:][::-1]
res = -int(x)
else:
x = s[::-1]
res = int(x)
if res > 2**31 or res < -2**31:
return 0
else:
return res