LeetCode从零刷起 (7. Reverse Integer)

LeetCode(7. Reverse Integer)

Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
click to show spoilers.
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.
**Note:
**The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

知识点:

  1. 这道题考察了关于C++ int类型的范围以及存储方式。这就要了解数字是如何在计算机存储的了,这涉及到原码,反码和补码的知识。关于这方面的内容,我推荐一篇讲得非常清楚的博客:C++原码,反码,补码详解
    不过在实际使用中,我们只需要知道C++ int 的范围位于-232 — 232-1, 且我们可以用INT_MAX表示int的最大值,用INT_MIN表示int的最小值。
  2. 关于一个数值是否越界的判断:这里我用到了这样一个小tip,即如果有可能 a + b > INT_MAX的话,为了防止越界造成的麻烦,我们用 a > INT_MAX – b 来判断。其他的运算同理(比如乘法转除法)。这样的等价判断避免了越界带来的麻烦。

解题思路:

这里要注意先判断x是否为INT_MIN,如果是的话,直接返回0,因为INT_MIN的反向数值是越界的;如果不是的话,这样我们就可以把x取绝对值而不用担心取绝对值后x的越界问题,便于我们对数字进行处理。
接下来就是对原来的数字一位一位的取反了,要注意的是在进行到最后一位的时候,要进行越界判断了。此时只要用到我们上面讲到的小tip就可以了。
最后的返回值别忘了正负号就好了。
C++代码如下:

class Solution {
public:
    int reverse(int x) {
        if (x == INT_MIN) 
            return 0;
        int ans = 0;
        bool flag = x<0? true:false;
        for (x=flag? -x:x; x>=10; x/=10){
            ans = ans*10 + x%10;
        }
        //check if out of bounds
        if (!flag){// positive number
            if (INT_MAX / 10 < ans) 
                return 0;
            if (INT_MAX - ans*10 < x)
                return 0;
        }
        else{//negative number
            if (-(INT_MIN / 10) < ans) 
                return 0;
            if (INT_MIN + ans*10 > -x )
                return 0;
        }
        //positive or negative process
        if (!flag){
            ans = ans*10 + x;
            return ans;
        }
        else{
            ans = -ans*10 - x;
            return ans;
        }
    }
};
    原文作者:CopyYoung
    原文地址: https://www.jianshu.com/p/f388c248007c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞