zoukankan      html  css  js  c++  java
  • 【刷题】【LeetCode】007-整数反转-easy

    【刷题】【LeetCode】总

    用动画的形式呈现解LeetCode题目的思路

    参考链接-空

    007-整数反转

    方法:

    弹出和推入数字 & 溢出前进行检查

    思路:

    我们可以一次构建反转整数的一位数字。在这样做的时候,我们可以预先检查向原整数附加另一位数字是否会导致溢出。

    算法:

    反转整数的方法可以与反转字符串进行类比。

    我们想重复“弹出” x 的最后一位数字,并将它“推入”到 rev 的后面。最后,rev 将与 x 相反。

    要在没有辅助堆栈 / 数组的帮助下 “弹出” 和 “推入” 数字,我们可以使用数学方法。

    //pop operation:
    pop = x % 10;
    x /= 10;
    
    //push operation:
    temp = rev * 10 + pop;
    rev = temp;
    

    但是,这种方法很危险,因为当 temp = rev*10 + pop 时会导致溢出。

    幸运的是,事先检查这个语句是否会导致溢出很容易。

    复杂度分析:

    代码:

    /*java*/
    class Solution {
        public int reverse(int x) {
            int rev = 0;
            while (x != 0) {
                int pop = x % 10;
                x /= 10;
                if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0;
                if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0;
                rev = rev * 10 + pop;
            }
            return rev;
        }
    

    }

    补充知识点:

    java int 类整数的最大值是 2 的 31 次方 - 1 = 2147483648 - 1 = 2147483647
    可以用 Integer.MAX_VALUE 表示它,即 int value = Integer.MAX_VALUE;

    Integer.MAX_VALUE + 1 = Integer.MIN_VALUE = -2147483648

    2^31-1=2147483647,-2^31=-2147483648
    官方给出的溢出判断是因为MAX_VALUE : 2147483647 MIN_VALUE : -2147483648 他要判断最后一位不要大于 7 和 不要小于8

  • 相关阅读:
    NOIP2002字串变换[BFS]
    NOIP2000单词接龙[DFS]
    NOIP2003传染病控制[按层DFS]
    NOIP1999邮票面值设计[搜索|DP]
    USACO1.1Broken Necklace[环状DP作死]
    洛谷P1120小木棍[DFS]
    NOIP2000进制转换
    Miller-Rabin素数快速检测
    【数论算法理论与实现】
    洛谷P1141 01迷宫
  • 原文地址:https://www.cnblogs.com/anliux/p/10588228.html
Copyright © 2011-2022 走看看