问题描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
(color{#FF0000}{注意:假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0.})
解法
class Solution {
public int reverse(int x) {
if(x==0)
return 0;
//模10
while(x%10==0)
x/=10;
return get(x);
}
public int get(int a) {
String str=a+"";
StringBuilder sb=new StringBuilder();
//负数
if(str.charAt(0)=='-')
{
sb.append("-");
for(int i=str.length()-1;i>0;i--) {
sb.append(str.charAt(i));
}
}
else {//正数
for(int i=str.length()-1;i>=0;i--) {
sb.append(str.charAt(i));
}
}
try{
Integer.parseInt(sb.toString());
}catch(java.lang.NumberFormatException e) {//如果溢出
return 0;
}
return Integer.parseInt(sb.toString());
}
}
出现的问题
- 在模10的情况前没有考虑特殊情况0
- 刚开始时不知道怎么处理溢出,后来想到处理异常的方式处理溢出(当字符串转为int不合法时会抛出异常)
结果
官方解法
class Solution {
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)) return 0;
if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;
}
return rev;
}
}
优秀解法
public int reverse(int x) {
int ans = 0;
while (x != 0) {
if ((ans * 10) / 10 != ans) {//使用这种方法来判断ans*10是否会溢出
ans = 0;
break;
}
ans = ans * 10 + x % 10;
x = x / 10;
}
return ans;
}
有问题是ans*10可能没有溢出但是在ans = ans * 10 + x % 10如果溢出则结果是错的。这里可以通过的原因是2147483647和-2147483648可以看到当溢出时,最后一位一定是1或2不会达个位7、8这样的溢出条件。同理,官方解法中也不用判断7、-8的大小。