题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-2^31 <= x <= 2^31 - 1
思路
题目很简单其实就是数字反转,我们很容易就可以想到把当前数x不断的除10减少位数,然后模10取每位数;但是现在题目要求在反转的过程中,如果出现了超过Integer范围内的值,也就是小于-2^31 或者大于2^31-1,需要直接返回0,我们如何能确定什么时候会超过Integer的返回呢?
如果我们假设反转后的数num还没有超过最大值MAX_VALUE了,那么我们可以得到如下不等式:
num≤MAX_VALUE
题目要求不能以超过int的数存储,MAX_VALUE=2^31-1=2147483647,所以我们可以转化成如下不等式:
rev*10 + pop ≤ (MAX_VAULE/10)*10 + 7
合并后可得到如下不等式:
(rev-MAX_VALUE/10)*10 ≤ 7 - pop
分别考虑三种情况:
- rev<MAX_VALUE/10,由于pop<10,所以不等式成立;
- rev=MAX_VALUE/10,当且仅当 pop≤7 时,不等式成立。
- rev>MAX_VALUE/10,不等式是不成立的。
而对于第2种情况,由于x不超过 MAX_VALUE,因此pop不会超过MAX_VALUE的最高位,即pop≤2。也就是说不等式永远成立,也就是说只要rev > MAX_VALUE/10 时,如果还有下一次取数,那么就肯定会超过MAX_VALUE。
同理大于等于最小值的时候也是同样的证明方法,于是有如下结论
if (rev > Integer.MAX_VALUE/10 ) return 0;
if (rev < Integer.MIN_VALUE/10 ) return 0;
AC代码
点击查看代码
class Solution {
public int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > Integer.MAX_VALUE/10 ) return 0;
if (rev < Integer.MIN_VALUE/10 ) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}