反转整数
题目:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。如果反转后整数超过32位的有符号整数的范围(-2147483648~2147483647),就返回0。
实例:
输入:x = 123
输出:321
输入:x = -123
输出:-321
输入:x = 120
输出:21
思路:我们举一个例子来说明思路吧,比如4821这个数字,我们该如何获得每一位上的数字呢?将整个整数拆分开?显然不行,对于整数,没有像字符串可以调用charAt()方法去拆分。那我们有没有其他办法呢? 我们会想到 /和%
,当一个数 和 10 做取余操作时,每次得到的数字就是当前数字的最后一位。
例:
4821 % 10 = 1
482 %10 = 2
48 % 10 = 8
4 %10 = 4
这样,我们就可以获取到每一位上的数字了,但是 从 4821 该如何变为 482 呢? 别忘了我们还有 /
运算符。
但是,有一个问题在于,有些数字,在没有反转前,它是属于32位整型的范围内的,但是反转后,就不属于了,此时应该返回0,那么如何判断一个数反转后是不是还是属于32位整型范围呢?我们可以在每次反转完后,进行判断。
代码示例:
public int reverse(int x) {
int res = 0;
int tmp = 0;
while(x!=0){
// 获取最后一位数字
tmp = x%10;
// 反转后判断
// res代表将每一位上的数字通过计算得出的 反转后的数据。
// tmp > 7 表示 当最后一次获取到未反转前数字的最后一位数时,如果大于7,那么反转后的数字为: 2147483648或2147483649.这显然超过了范围。
if(res > 214748364 || (res == 214748364 && tmp > 7)){
return 0;
}
if(res < -214748364 || (res == -214748364 && tmp < -8)){
return 0;
}
res = res*10 + tmp;
x/=10;
}
return res;