题目描述如下:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
我为这道题尝试了3种解法,一开始的解法运行时间为499ms,觉得太慢了,于是在网上参考了别人的思路,的确是快了一些,但是后来觉得在刷题的时候没这必要,运行出来就行了。三种解法的思路及代码如下:
1.首先判断是正数还是负数,设置一个res变量,负数为true,正数为false。然后再将整数转成字符串,由于StringBuffer和StringBuilder有反转的方法,于是构造一个stringbuffer对象,将其反转后再变为字符串,最后再将字符串转成Int类型,此处要捕获异常,当溢出时返回0。
public int reverse1(int x){//499ms
boolean res=false;
String s;
if(x>0){
s=""+x;
}else{
x=-x;
s=""+x;
res=true;
}
StringBuffer sb = new StringBuffer(s);
s = sb.reverse().toString();
try{
x = Integer.parseInt(s);
}catch(NumberFormatException e){
System.out.println(e);
return 0;
}
if(res){
return -x;
}else{
return x;
}
}
2.这个是参考别人的,但是不是很了解这个是怎么判断溢出的
public int reverse2(int x){//306ms
int result = 0;
int mod = 0;
while(x != 0) {
mod = x % 10;
if (result > 0) {
if (result > Integer.MAX_VALUE/10 || (result == Integer.MAX_VALUE / 10 && mod > Integer.MAX_VALUE % 10))
{
return 0;
}
} else {
if (result < Integer.MIN_VALUE / 10 || (result == Integer.MIN_VALUE / 10 && mod < Integer.MIN_VALUE % 10))
{
return 0;
}
}
result = result * 10 + mod;
x /= 10;
}
return result;
}
3.这个思路更好理解,和第二种思路差不多,只不过判断溢出的方式不一样,设置一个long类型的testresult,通过result和testresult的比较,不相等就表示溢出了,则返回0;否则返回result
public int reverse3(int x) { //305ms
int result = 0;
int mod = 0;
long testresult=0;
while(x != 0) {
mod = x % 10;
result = result * 10 + mod;
testresult = testresult * 10 + mod;
x /= 10;
}
if(testresult!=result){
return 0;
}
return result;
}