zoukankan      html  css  js  c++  java
  • 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;
        }
    };
  • 相关阅读:
    RTTI应用一例,改变窗体上所有控件的颜色(如果这个控件有Color属性的话)
    ddd
    终于懂了:TWinControl主要是Delphi官方用来封装Windows的官方控件,开发者还是应该是有TCustomControl来开发三方控件
    C++能在三个地方创造对象,而Delphi只有一个地方
    win32内存调用图
    让C#、VB.NET实现复杂的二进制操作
    谈谈华为(这篇文章比较有思想,对不对另说)
    How to configure CDB in Qt Creator(使用VC调试器)
    kbmMW 5.0.1发布了(跨全平台,包括Linux,可使用Win的高性能HTTPSys传输层,等等)
    FMXUI
  • 原文地址:https://www.cnblogs.com/huangming-zzz/p/10204392.html
Copyright © 2011-2022 走看看