给你一个带符号的32位的整数,给出该整数反转后的结果
注意:假设我们的环境只能处理32位有符号范围内的整数,如果反转后的整数溢出,请在你的函数中返回0。
1. 利用java自带的将字符串转为数字的方法,要注意反转后的整数是否会溢出。
public int reverse(int x)
{
int maxInt = 0x7fffffff; // 32位最大正数
int minInt = 0x80000000; // 32位最小负数
StringBuffer sb = new StringBuffer();
boolean flag = true; // 符号正负的标志,默认是正数
long ans = 0;
// 先判断x的正负
if (x < 0)
{
// 由于最小负数,取负后还是它本身,故需特殊处理
if (x == minInt)
{
ans = 0;
return (int)ans;
}
x = -x;
flag = false;
}
String str = sb.append(x).reverse().toString();
ans = Long.parseLong(str); // 这里使用parseLong是防止反转后的整数超出maxInt
if (flag == false)
ans = -ans;
// 如果x比32位最大正数还要大,或者x比32位最小整数还要小时,结果会溢出
if (ans > maxInt || ans < minInt)
{
ans = 0;
}
return (int)ans;
}
2. 利用取模和整除运算,互换整数的高低位
public int reverse(int x)
{
int maxInt = 0x7fffffff; // 32位最大正数
int minInt = 0x80000000; // 32位最小负数
long ans = 0;
boolean flag = true; // 记录该数字是否是正数
if (x < 0)
{
if (x <= minInt)
{
return 0;
}
x = -x;
flag = false;
}
while (x > 0)
{
ans = ans*10 +(x % 10);
x /= 10;
}
if (flag == false)
{
ans = -ans;
}
// 判断反转后的ans的情况
if (ans > maxInt || ans < minInt)
{
return 0;
}
return (int)ans;
}
3. 大神提供的解法
public int reverse03(int x)
{
int result = 0;
while (x != 0)
{
int tail = x % 10;
int newResult = result * 10 + tail; // 如果newResult会溢出,则它的值会变小,该等式就不再成立。
System.out.println("newResult: "+newResult + " result " + result +" tail " + tail);
System.out.println(newResult - tail);
System.out.println();
if ((newResult - tail)/ 10 != result)
{
return 0;
}
result = newResult;
x = x / 10;
}
return result;
}