1.方法一(字符串反转求解)
1.使用long
class Solution {
public int reverse(int x) {
long a=Math.abs((long)x);
StringBuilder sb=new StringBuilder(String.valueOf(a)).reverse();
long ans=Long.parseLong(sb.toString());
if(x<0) ans=-ans;
if(ans<Integer.MAX_VALUE&&ans>Integer.MIN_VALUE)
return (int)ans;
else return 0;
}
}
2.不使用long
使用String转换为int型是否报错来判断是否溢出
class Solution {
public int reverse(int x) {
if(x==0||x==Integer.MIN_VALUE)return 0;//这里防止其不能取绝对值
int temp=Math.abs(x);
StringBuilder sb=new StringBuilder(String.valueOf(temp)).reverse();
int ans;
try {
ans=Integer.parseInt(sb.toString());
} catch (NumberFormatException e) {
return 0;
}
return x>0?ans:-ans;
}
}
2.方法二(数学法)
class Solution {
public int reverse(int x) {
boolean flag=x>0?true:false;
//这里进行特殊判断,防止不能取绝对值
if(x==0||x==Integer.MIN_VALUE)return 0;
x=Math.abs(x);//这时候x全为正整数
int h=0;
while(x!=0){
if(h>Integer.MAX_VALUE/10||(h==Integer.MAX_VALUE/10&&x>7))return 0;
h=h*10+x%10;
x/=10;
}
return flag?h:-h;
}
}
3.方法三(二次反转法)
1.如果数据溢出,反转之后的数值是和原来不一样的
2.如果输入的数对10取余==0,一定不溢出
class Solution {
public int reverse(int x) {
int a=x;
int b=0;
while(a!=0){
b=b*10+a%10;
a/=10;
}
int ans=b;//第一次反转的结果
int c=0;
while(b!=0){
c=c*10+b%10;
b/=10;
}//第二次反转结果是c
if(c==x||x%10==0)//两次反转结果一样或者对10取余为0,不溢出
return ans;
else return 0;
}
}
细节1
如果x为-2147483648即Integer.MIN_VALUE,取绝对值之后还是其本身
其实是因为最大正数为2147483647,而最小负数为-2147483648,对最小负数加绝对值后,已经超过了最大正正数所表达的范围。
int x=Integer.MIN_VALUE;
x=Math.abs(x);
int a=-2147483648;
a=-a;
System.out.println(a);//-2147483648
解决这个问题需要将x转变为long 类型
long a=Math.abs((long)x);
细节2
Integer.parseInt(sb.toString())
字符串解析函数会自动去除字符串前导0
public static void main(String[] args) {
StringBuilder sb=new StringBuilder("20");
System.out.println(sb);//20
System.out.println(Integer.parseInt(sb.toString()));//20
sb.reverse();
System.out.println(sb);//02
System.out.println(Integer.parseInt(sb.toString()));//2
}