给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1] 请根据这个假设,如果反转后整数溢出那么就返回 0。
1.判断正(负)数 —> 转化为字符串 —> 反转字符串 —> 转化为long型数字 —> 判断是否越界 —> 输出
package test;
public class test10 {
public static void main(String[] args) {
test10 t = new test10();
t.reverse(-2147483648);
}
public int reverse(int x) {
if(x < 0) {
if(x == -2147483648) {
System.out.println(0);
return 0;
}
String s = Integer.toString(x*-1);
String sb = new StringBuffer(s).reverse().toString();
long result = Long.parseLong(sb)*-1;
if(result < Math.pow(-2, 31)) {
System.out.println(0);
return 0;
} else {
System.out.println(result);
x = (int) result;
return x;
}
} else {
String s = Integer.toString(x);
String sb = new StringBuffer(s).reverse().toString();
long result = Long.parseLong(sb);
if(result > Math.pow(2, 31)-1) {
System.out.println(0);
return 0;
} else {
System.out.println(result);
x = (int) result;
return x;
}
}
}
}
因 int 范围为 [−231, 231 − 1],即[-2147483648, 2147483647]。所以当输入值为 -2147483648 时,String s = Integer.toString(x*-1);
转化会失败 s 仍等于 -2147483648,以至于没去掉负号 “-”,影响到后续字符串反转等操作,所以此处加了 x == -2147483648
的判断。
输出:
2.弹出和推入数字 & 溢出前进行检查
package test;
public class test10 {
public static void main(String[] args) {
test10 t = new test10();
t.reverse(-2147483648);
}
public int reverse(int x) {
int rev = 0;
while(x != 0) {
int pop = x % 10;
x /= 10;
if(rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE/10 && pop > 7)) {
System.out.println(0);
return 0;
}
if(rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE/10 && pop < -8)) {
System.out.println(0);
return 0;
}
rev = rev * 10 + pop;
}
return rev;
}
}
每次把 x 除10求余,即 int pop = x % 10;
得到 x 的最后一位数字,把它放到 rev 中的第一位,并与后续 x 求余的数拼接,即 rev = rev * 10 + pop;
并判断 rev 是否越界。
辅助理解:
//pop operation:
pop = x % 10;
x /= 10;
//push operation:
temp = rev * 10 + pop;
rev = temp;
输出: