Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
1 逻辑很简单,每一次都在原来结果的基础上变大10倍,再加上对10的余数。然后x除以10。
2 就上面这个逻辑就能过AC。但是我觉得这道题目如果面试时候碰到,可以问的还有很多:
a 会不会溢出? 会
b 怎么处理? 可以修改函数参数,可以抛出异常,可以检查所有溢出的,都设置为0
c Math.abs(Integer.MIN_VALUE) 得到的值是多少?还是和原来一样的,为啥?因为得到+2147483648和-2147483648在32位表示上面是一样的。
3 这道题目应该10分钟内可以完成。
<span style="font-size:18px;">public class Solution {
public int reverse(int x) {
int sign = (x>=0)? 1 : -1 ;
int temp = Math.abs(x);
int ans =0;
while(temp>0){
ans=ans*10+temp%10;
temp/=10;
}
return sign*ans;
}
}</span>
新代码
public class Solution {
public int reverse(int x) {
if(x==0){
return 0;
}
boolean sign = x>0 ? true:false;
long cur = (long)x;
if(!sign){
cur = -cur;
}
long ans =0;
while(cur>0){
ans =ans*10+cur%10;
cur/=10;
}
if(!sign){
ans =-ans;
}
if(ans>Integer.MAX_VALUE || ans < Integer.MIN_VALUE){
return 0;
}
return (int)ans;
}
}
1 题目已经把溢出的检测部分加上;我用JAVA的long来做先,如果不溢出再转换成int的答案。
2 需要考虑末尾为0的情况,比如10,100。这时候如果0放在前面,要用字符串;如果不要0在前面,用数学计算。
网上看到另一种处理溢出的方式,参考:
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;
}