给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
这个题是一个数学题,假设输入的数是x
,我们可以通过不断地弹出x的最小位的数,把它加到结果中。
稍微复杂一点的是题目中提到的反转后越界的判断。
先上代码再分析越界是怎么判断的:
class Solution {
public int reverse(int x) {
int res = 0;
while( x != 0) {
// 处理越界问题
if (Math.abs(res) > (Integer.MAX_VALUE - Math.abs(x % 10)) / 10)
return 0;
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
}
其实也很简单,我们可以通过这句代码反推:
res = res * 10 + x % 10;
要做越界控制,那么应该有以下的公式成立:
// 假如x是正数
if((res*10 + x % 10 ) > Integet.MAX_VALUE)
return 0;
但因为int
32位的限制问题,显然是不能直接这样写的。于是稍作转换:
// 这里要考虑负数
if (Math.abs(res) > (Integer.MAX_VALUE - Math.abs(x % 10)) / 10)
return 0;
感谢您的阅读,若您喜欢,可以点击下方的的“推荐”支持我。谢谢!
也可以关注我的慕课账号,会经常更新Java、算法、Vue开发方面的文章哦~