leetcode_整数反转

Posted 明卿册

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了leetcode_整数反转相关的知识,希望对你有一定的参考价值。

官方题解已经说的很清楚了,

这样只记录自己实现过程中遇到的问题,

但最终并未解决、、、

还是请大家以官方题解为准:https://leetcode-cn.com/problems/reverse-integer/solution/

 

老师在讲《安全程序设计》这门课时,

开篇就是整数安全,

当时不以为然,

现在吃了大亏才明白。

 

附上本人写得代码:

class Solution {
public:
    int reverse(int n) {
        int ans = 0,pop = 0;  //ans是最终输出,pop是每次取出的最末尾的数字
        bool flag = true;  //用来区分是正数还是负数,此处有重大问题,接下来会讲到。
if(n < 0) {  //如果是负数,变成正数来处理。想法很简单,但其实有很大的问题 flag = false; n = 0 - n; } while(n != 0) { pop = n % 10; n /= 10; if(ans > INT_MAX/10) return 0;  //越界可能情况1 if(ans == INT_MAX/10) {  //越界可能情况2 if(pop > 9) return 0; if(flag && pop == 8) return 0;   } ans = 10 * ans + pop; } if(!flag) ans = 0 - ans; return ans; } };

关于第17、18两行:

注意到INT32的取值范围是从:-2147483648~2147483647,

注意最后最后一位:

如果是负数,不能超过8;

如果是正数,则不能超过7。

也就是说,不论正数还是负数,最后一位都不能是9,

如果是正数,也不是8。

 

关于我一开始分正负数讨论的想法,问题出在了:

对于负数,我统一取了绝对值,

但是-2147483648取绝对值变成了2147483648

INT32最大正数只能是2147483647

于是溢出,产生了回绕现象——变成了-2147483648

我们将每次运算的结果输出出来,就可以看得很清晰

结果就一目了然了,

虽然我们取了绝对值,

但是n变成2147483648之后溢出成了-2147483648,

所以pop和n都变成了负数。

 

恕本人水平有限,

想到的解决方案是将pop和n绝对值化,

即在while(n != 0)内:

将pop = n%10变成pop = abs(n%10)

如果以后能想到更好的办法,

会更新此文,

最后是20ms过了本题

最终代码:

class Solution {
public:
    int reverse(int n) {
        
        int ans = 0, pop = 0;
        bool flag = true;
        if (n < 0) {
            flag = false;
            n = 0-n;
        }
        while (n != 0) {
            pop = abs(n % 10);
            n /= abs(10);
            if (ans > INT_MAX / 10) return 0;
            if (ans == INT_MAX / 10) {
                if (pop == 9) return 0;
                if (flag && pop == 8) return 0;
            }
            ans = 10 * ans + pop;
        }

        if (!flag) ans = 0 - ans;
        return ans;
    }
};

 

以上是关于leetcode_整数反转的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode刷题记录_反转整数

Leetcode_07整数反转

<LeetCode天梯>Day016 整数反转(暴力求解+直接反转) | 初级算法 | Python

LeetCode 4.反转整数

2021-09-11:给你一个32位的有符号整数x,返回将x中的数字部分反转后的结果。反转后整数超过 32 位的有符号整数的范围就返回0,假设环境不允许存储 64 位整数(有符号或无符号)。(代码片段

Leetcode 7. 整数反转-简单