描述:给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)
思路:就是一般的整数翻转,不过需要注意两个check点。。。。(都是泪)
1:整数可正可负,但是在这里面可以不用考虑,因为x为正数和负数的情况下的思路都是相同的。
当x为正数时。将a=x%10,得到x的个位数。ret = ret*10+a。后面依次进行即可得到翻转后的整数。
例如:x=235
(5*10+3)*10+2=532.
当x为负数时,这种思路也是成立的。
2: 翻转过程中需要考虑溢出的情况。
在x的翻转的过程中会出现溢出的情况,1199483674这个整数没超出int的范围-2^32~2^31,但是翻转的过程中会出现溢出。
if(ret>Integer.MAX_VALUE/10 || ret<Integer.MIN_VALUE/10){
return 0;
}
ret>Integer.MAX_VALUE/10这个用来判断正数是否溢出,只需要判断到最大值的十分之一即可,因为当x的位数和int的最大值位数一样时,翻转后的最后面的一位
肯定不会超过int最大值的第一位,因为输入时的值已经被int限制了,不可能大于int最大值。
时间复杂度:O(1)
空间复杂度:O(1)
完整代码如下:
public int Reserve(int x){
int ret = 0;
while(x != 0){
if(ret>Integer.MAX_VALUE/10 || ret<Integer.MIN_VALUE/10){
return 0;
}
ret = ret*10 + x%10;
x = x/10;
}
return ret;
}
2021-05-25