思路
这道题说起来贼简单, 思路倒没什么思路, 就是把数字一个一个剥离下来然后逆序还原就行了.
实现
看上去简单我却提交了三次才AC. 这里面其实关于int越界的情况的坑很多, 就比如输入的结果是一个10位的int, 倒过来就会越界, 此时要特别小心, 按题目的意思应该返回0.
提交
前两次都爆炸, 第一次由于我用了绝对值函数, 碰到输入是最大负整数的情况就炸了, 第二次是我实现中说的, 碰到一个刚开始可以, 倒过来越界的, 又炸了...
代码
public class Solution {
public int reverse(int x) {
if(x == -2147483648) return 0;
boolean isNegative = x < 0;
x = Math.abs(x);
long[] queue = new long[32];
int start = 0, end = 0;
while (x != 0){
queue[end++] = x % 10;
x /= 10;
}
long re = 0;
while (start < end){
re = re * 10 + queue[start++];
}
if(isNegative){
re = re > 2147483648l ? 0 : -re;
}else{
re = re > 2147483647l ? 0 : re;
}
return (int)re;
}
}
最佳实现
这里其实完全可以省略这个简易的queue, 另外正负号其实不用分开进行讨论, 完全可以合在一起讨论, 另外检查越界的情况可以用运算还原检查值是否相等来判断. 网上看到最优雅的实现是这个 :
public int reverse(int x)
{
int result = 0;
while (x != 0)
{
int tail = x % 10;
int newResult = result * 10 + tail;
if ((newResult - tail) / 10 != result)
return 0;
result = newResult;
x = x / 10;
}
return result;
}
这种解法稍微在越界问题上会产生误导, 建议看一下第8题.