LeetCode 007 Reverse Integer

来源:互联网 发布:淘宝如何做详情页 编辑:程序博客网 时间:2024/05/23 18:24

题目


Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

把int  给倒序成为新的int


思路


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;}





0 0