zoukankan      html  css  js  c++  java
  • LeetCode刷题--7.整数反转(简单)

    题目描述

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

    示例 1:

    输入: 123

    输出: 321

     示例 2:

    输入: -123

    输出: -321

    示例 3:

    输入: 120

    输出: 21

    思路

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

    关键点

    弹出和推入数字

        弹出:int pop = x % 10;

        推入:ans = ans * 10 + pop;

           x /= 10;

    溢出前进行检查

    • 本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换加try catch的方式来解决,第二个思路就是通过数学计算来解决。
    • 由于字符串转换的效率较低且使用较多库函数,所以解题方案不考虑该方法,而是通过数学计算来解决。
    • 通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。
    • 溢出条件有两个,一个是大于整数最大值NAX_VALUE,另一个是小于整数最小值MIN_VALE,设当前计算结果为ans,下一位为pop。
    • 从ans * 10 + pop > MAX_VALUE这个溢出条件来看

        当出现ans > MAX_VALUE / 10且还有pop需要添加时,则一定溢出

        当出现ans == MAX_VALUE / 10且pop > 7时,则一定溢出,7是231-1的个位

    • 从ans * 10 + pop〈 MIN_VALUE这个溢出条件来看

        当出现ans < MIN_VALUE / 10且还有pop需要添加时,则一定溢出

        当出现ans == MIN_VALUE / 10且pop < -8时,则一定溢出,8是-231的个位数

     代码:

    class Solution {
        public int reverse(int x) {
            int ans = 0;
            while (x != 0) {
                //重复"弹出" x 的最后一位数字
                int pop = x % 10;
                //溢出前进行检查
                if (ans > Integer.MAX_VALUE / 10 || (ans == Integer.MAX_VALUE / 10 && pop > 7))
                    return 0;
                if (ans < Integer.MIN_VALUE / 10 || (ans == Integer.MIN_VALUE / 10 && pop < -8))
                    return 0;
                //*10相当于位数扩大了一位,+pop相当于给个位赋值
                ans = ans * 10 + pop;
                //删除个位数
                x /= 10;
            }
            return ans;
        }
    }

    图解:

     

     

  • 相关阅读:
    NotFoundHttpException
    postMan
    Extjs win
    Extjs toolbar 如何添加竖杆分隔符
    Extjs iconCls 的用法
    b站Java基本语法4之进制转换
    b站Java基本语法4之基本数据类型的运算规则
    b站数据库课2之连接查询
    b站Java尚硅谷0
    b站数据库课1之分组函数分组查询
  • 原文地址:https://www.cnblogs.com/xiaozhongfeixiang/p/12018422.html
Copyright © 2011-2022 走看看