[LeetCode]--Reverse Integer

来源:互联网 发布:医生转行 知乎 编辑:程序博客网 时间:2024/06/07 09:03

题目

    Reverse digits of an integer.

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

    Note:
    The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

    中文题意:给出一个32位整数,要求取其逆序并返回。

    注意:输入必须是32位有符号整数,如果逆序后有溢出,则返回0。


分析

        这道题看似简单,但是背后有很多陷阱。例如当输入为10010时,返回的应该是什么呢?我们又如何判断取逆序后的数是否溢出呢?
       对于第一个问题,我个人认为用int类型定义变量处理会省掉很多麻烦。我们无需判断个位是否为0,只需将输入数做取模运算,再依次序累加即可。
       而对于第二个问题,我花费了很长时间才得以解决。这里我们先具体说明一下这道题的算法:
       1. 首先,对输入整数(x)做取模运算,即x%10。这时我们得到该整数的最低位(即个位),随后x = x/10,将最低位移除。
       2. 然后令结果result=x%10。随即进入循环,令result = result * 10,也即实现原整数的低位向高位转换的过程,移位过后,令result = result + x%10,将x的最低位移入后,再令x = x/10。
       3. 重复上一步骤直至x的所有为移出,也即x=0。
       我们不难发现,检验结果是否溢出需要在第2步完成,而在第二步的什么位置呢?如果在result = result * 10之后判断,那么乘以10这个过程中就可能已经出现溢出了,结果显然不能达到我们的预期。因此我们应在result = result * 10之前判断,注意,因为这时还没有进行向左移位的操作,因此必须将32位有符号整数的边界除以10,也即减少移位,才能达到目的。

解答

class Solution {public:    int reverse(int x) {        int result;        result=x%10;        x=x/10;        while(x!=0){            if(result>INT_MAX/10||result<INT_MIN/10)            return 0;            result=result*10;            result=result+x%10;            x=x/10;        }        return result;    }};

        该算法复杂度为O(n),其中n为输入整数x的位数。

原创粉丝点击