题目:给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例:
输入: 123
输出: 321
输入: -123
输出: -321
输入: 120
输出: 21
java版
解法一思路:
每次%10,从末尾取出数据,放到int数组中,这样就将整数倒过来了,然后依次乘以10,就组装成了最终结果,需要注意溢出问题,所以结果变量是用Long类型存储的,最后判断没有溢出转为int类型。
public int reverse(int x) {
//int类型的是4个字节,32位的
int[] result = new int[32];
int m = x%10;
int r = x/10;
int i = 0;
result[i] = m;
while(r !=0) {
i++;
m = r%10;
result[i] = m;
r = r/10;
}
int flag =0;
Long resultNum = 0l;
for(int j=0; j<=i; j++) {
int i1 = result[j];
if(i1 == 0 && flag == 0) {
continue;
} else {
flag = 1;
}
resultNum = resultNum * 10 + i1;
}
long rr = resultNum;
if(Integer.MAX_VALUE < rr || Integer.MIN_VALUE > rr) {
return 0;
}
return (int)rr;
}
上面的思路很通俗,但是效率不高,有更高效的方式:
public static int reverse2(int x) {
int rev =0;
while(x !=0) {
int pop = x%10;
x /=10;
//这里判断是否存在溢出
//rev > Integer.MAX_VALUE/10 之所以除以10,是因为如果用rev与Integer.MAX_VALUE来判断,rev很可能存在溢出,代码直接就报错了
//rev==Integer.MAX_VALUE/10 && pop>7 这里判断如果rev距离溢出只差1位,并且当前的rev的值与Integer.MAX_VALUE/10值相等,这是就要判断余数了
//因为Integer.MAX_VALUE=2147483647,末尾是7,所以做了pop>7的判断
//因为Integer.MIN_VALUE=-2147483648,末尾是7,所以做了pop<-8的判断
if(rev > Integer.MAX_VALUE/10 || rev==Integer.MAX_VALUE/10 && pop>7) {
return 0;
}
if(rev < Integer.MIN_VALUE/10 || rev==Integer.MIN_VALUE/10 && pop<-8) {
return 0;
}
//验证通过了溢出检查,就把当前值加到反转结果上
rev = rev*10+pop;
}
return rev;
}
代码中有一个关键点就是判断是否溢出:
if(rev > Integer.MAX_VALUE/10 || rev==Integer.MAX_VALUE/10 && pop>7) {
return 0;
}
if(rev < Integer.MIN_VALUE/10 || rev==Integer.MIN_VALUE/10 && pop<-8) {
return 0;
}
rev > Integer.MAX_VALUE/10 之所以除以10,是因为如果用rev与Integer.MAX_VALUE来判断,rev很可能存在溢出,代码直接就报错了。
rev==Integer.MAX_VALUE/10 && pop>7 这里判断如果rev距离溢出只差1位,并且当前的rev的值与Integer.MAX_VALUE/10值相等,这是就要判断余数了。
因为Integer.MAX_VALUE=2147483647,末尾是7,所以做了pop>7的判断。
因为Integer.MIN_VALUE=-2147483648,末尾是7,所以做了pop<-8的判断。