题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
样例
输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
算法1
使用long
记录
- 1、用
long long
类型res
记录翻转后的值,对x
每次进行模10
操作,模10
后的结果拼接到res
末尾,再x /= 10
- 2、当
res > 2^31 − 1
或者res < −2^31
,表示已经超出范围,返回0
时间复杂度 $O(32)$
Java 代码
class Solution {
public int reverse(int x) {
long res = 0;
while(x != 0)
{
res = res * 10 + x % 10;
x /= 10;
}
if(res > Integer.MAX_VALUE) return 0;
if(res < Integer.MIN_VALUE) return 0;
return (int)res;
}
}
算法2
使用int
记录
- 1、用
long long
类型res
记录翻转后的值,对x
每次进行模10
操作,模10
后的结果拼接到res
末尾,再x /= 10
- 2、在
1
操作的拼接之前,需要判断拼接后是否会越出int
范围
当res > 0
时,若res * 10 + x % 10 > INT_MAX
,等价于res > (INT_MAX - x % 10) / 10
,若成立,则超出范围(注意,这里x
是正数)
当res < 0
时,若res * 10 + x % 10 < INT_MIN
,等价于res < (INT_MIN - x % 10) / 10
,若成立,则超出范围(注意,这里x
是负数)
时间复杂度 $O(32)$
Java 代码
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;
}
}