题目
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231<= x <= 231- 1
题解
思路:
假设该数为x:
一、写出反转数
1、初始化x的反转整数rev=0;
2、逐次从x取出末尾数字,直至x为0
- digit=x%10; //整数x最后一位:x%10;
- x/10; //去除x的最后一位:
3、将取出的数字逐次放入到反转数rev数中
- rev*10+digit; //保存反转后的数据
二、判断反转数是否超过有效范围
1、在「推入」数字之前,判断是否满足
- −231≤rev⋅10+digit≤231−1
成立保存并输出
不成立则返回 0
2、但不允许使用 64位整数,需在 32位有符号整数的范围内考虑
代码:
class Solution {
public int reverse(int x) {
int rev=0;
while(x!=0){
//判断反转数是否越界
if(rev>Integer.MAX_VALUE/10||rev<Integer.MIN_VALUE/10){
return 0;
}
//每次取末尾数字
int digit=x%10;
x/=10;
//保存反转数
rev=rev*10+digit;
}
return rev;
}
}
不用判断 (rev== 214748364 && tmp>7) 和 (rev==-214748364 && tmp<-8) 的,原因如下:
- 输入x的范围为 [−2^31, 2^31 − 1] = [-2147483648, 2147483647]
- 反转后的值 rev 要想越界,则必定也是10位数字组成(不考虑符号位)
- rev越界存在两种情况:
- case1: rev前9位中的第 m 位大于 214748364 的对应位,且第1~(m-1)位都与214748364 的对应位相等
- case2: rev前9位就是214748364,最后一位为8或者9(这也就是 (rev== 214748364&&tmp>7) 和(rev==-214748364 && tmp<-8))。但这是不可能的:因为这种情况下,x本身就已经越界了。
原数是int类型数,int最大值和最小值的最高位是2。如果一个原数与int类型数的最大值或最小值的长度相等,那么这个数的最高位数也只能为1或2,那么它对应反数的最后一位也只能为1或2。int最大值的最后一位数为7,1或2肯定小于7;int最小值的最后一位数为-8, -1,-2肯定大于-8。
复杂度分析
- 时间复杂度:O(log∣x∣)。翻转的次数即 x 十进制的位数。
- 空间复杂度:O(1)