Leet Code OJ 7. Reverse Integer [Difficulty: Easy]

题目:
Reverse digits of an integer.

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

Have you thought about this?
Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!

If the integer’s last digit is 0, what should the output be? ie, cases such as 10, 100.

Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows. How should you handle such cases?

For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

翻译:
反转一个整形数的数值。
你是否考虑了这些?
在写代码之前,这里有一些好问题需要被提出来讨论一下。如果你已经考虑到了这些问题,在面试中会是一个加分项。
如果整数的某位是0,那输出结果应该是怎样的?例如,像10,100这种用例。
你注意到反转后的整数可能导致溢出吗?假定输入是一个32位的整数,然后1000000003的反转后的结果会导致溢出。你怎样处理这些溢出?
考虑到这个问题,我们假定你的程序在反转溢出时返回0。

分析:
这道题目看似简单,实则非常容易出错,通过率也较低。原因在于结果溢出的处理上(根据题目的补充说明,溢出返回0),做题时,需要考虑以下几种特殊情况:
1. 在做反转的时候,我把输入的数字统一转化为正数处理。这个时候可能产生第一次溢出。
2. 当输入为类似100时,检查输出是否正确。
3. 在反转的过程中,由于可能产生溢出,我将中间结果采用long保存。
4. 将long转化为int时,需要根据输入的符号,再次判断是否溢出。

代码:

public class Solution {
    public int reverse(int x) {
        boolean flag=false;
        if(x<0){
            flag=true;
            if(-(long)x>Integer.MAX_VALUE){
                return 0;
            }
            x=-x;
        }
        long result=0;
        while(true){
            result=result*10+x%10;
            if(x<10){
                break;
            }
            x/=10;
        }

        if(flag){
            if(-result<Integer.MIN_VALUE){
                return 0;
            }
            return -(int)result;
        }
        if(result>Integer.MAX_VALUE){
            return 0;
        }
        return (int)result;
    }
}

你可能感兴趣的:(LeetCode,算法,溢出)