LeetCode 第 7 题(Reverse Integer)

LeetCode 第 7 题(Reverse Integer)

题目是这样的:

Reverse digits of an integer.

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

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.

这道题的难度等级被标为 “Easy”, 实际上这道题并不 “Easy”. 难点就在于要考虑整数溢出的问题.

先给个不考虑整数运算溢出问题的代码(实际上,一开始写代码就考虑的太全面的话,会很难下笔。这时不如先写个大概能用的,然后再一步步重构来改善代码):

int reverse(int x)
{
    int ret = 0;
    do
    {
        ret = 10 * ret + x % 10;
        x = x / 10;
    }while(x);
    return ret;
}

如何简便的判断运算是否溢出是个难题。我暂时还没找到好办法。不过解决这个问题可以用些变通的方法。比如说我把 x 的每个十进制位的具体数字都记录下来。然后与我算出的结果进行比较,如果对应的位都是对的,那就表示没有溢出。下面是按照这个思路给出的代码。

int reverse(int x)
{
    int ret = 0;
    int count = 0;
    char str[12];
    do
    {
        str[count++] = x % 10;
        ret = 10 * ret + x % 10;
        x = x / 10;
    }while(x);
    int ret2 = ret;
    while(count > 0)
    {
        if( ret % 10 != str[--count])
        {
            return 0;
        }
        ret = ret / 10;
    }
    return ret2;
}

还有另外一种思路,既然用 int 型进行计算会溢出,那就选个更大的数据类型,比如 long long,这样不就不溢出了。按照这个思路,有下面的代码:

int reverse(int x)
{
    long long ret = 0;
    do
    {
        ret = 10 * ret + x % 10;
        x = x / 10;
    }while(x);

    if(ret > INT_MAX || ret < INT_MIN)
    {
        return 0;
    }
    return ret;
}

这个代码比较简洁,对这个问题来说应该是个不错的答案。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值