LeetCode 07.整数反转
最开始的想法是将int使用Math.abs(x)得到绝对值,转换成StringBuffer后使用reverse()方法进行反转,再转换成String类型,最后转为long类型。
随后判断aLong的溢出问题后再转换成int类型。
正常的数值下,例如:123 反转得到 321
public static int reverse(int x) {
String string = new StringBuffer(Math.abs(x) + "").reverse().toString();
if (x==0){
return 0;
}
long aLong = Long.valueOf(string);
if (x>0){
if (aLong>Integer.MAX_VALUE){
return 0;
}else {
return (int)aLong;
}
}else {
if (aLong<Integer.MIN_VALUE){
return 0;
}else {
return (int)aLong;
}
}
}
这个时候你以为成功了,但是当x=-2147483648,开始报异常了
Exception in thread "main" java.lang.NumberFormatException: For input string: "8463847412-"
没错这个时候出现问题了。问题的原因则是Math.abs(-2147483648),得到的绝对值是-2147483648。
Java里头,32位的int类型(最高位是预留出来表示正负号的)
最大值为:2147483647, 二进制:01111111111111111111111111111111
最小值为:-2147483648,二进制:10000000000000000000000000000000
二进制正负转换的方式是反码+1,反码就是正码的所有位数的0和1对换
-2147483648的正码:10000000000000000000000000000000
-2147483648的反码:01111111111111111111111111111111
-2147483648的反码+1:10000000000000000000000000000000
然后搞了半天,Math.abs(-2147483648)=-2147483648。
所以这个样子写显然是不对,搞了半天,不对。
重新想了一下,使用取余的方式。
n = n * 10 + x % 10;
x /= 10;
举例:当x = 1234时
n = 0+1234 % 10 = 0 + 4 = 4
x = 1234 / 10 = 123
根据x!=0循环下去
n = 4 * 10 + 123 % 10= 40 + 3 = 43
x = 123-10 = 12
…
最后
n = 4321
x = 0
public static int reverse(int x) {
int n = 0;
while (x != 0) {
n = n * 10 + x % 10;
x /= 10;
}
return n;
}
这个是很显然还是没有完成的,还要进行一下溢出的判断。
public static int reverse(int x) {
int n = 0;
while (x != 0) {
if ((n * 10) / 10 != n) {
n = 0;
break;
}
n = n * 10 + x % 10;
x /= 10;
}
return n;
}