• 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;
        }
    }

    图解:

     

     

  • 相关阅读:
    技术面试问题汇总第005篇:猎豹移动反病毒工程师part5
    技术面试问题汇总第004篇:猎豹移动反病毒工程师part4
    Hexo安装和配置
    hexo从零开始到搭建完整 转
    window下phpstudy的nginx配置虚拟主机
    CentOS Linux搭建SVN服务器
    解决CentOS7关闭/开启防火墙出现Unit iptables.service failed to load: No such file or directory.
    numpy使用
    Linux学习15_CentOS6.5下netcat工具安装教程
    中国天气网七天天气
  • 原文地址:https://www.cnblogs.com/xiaozhongfeixiang/p/12018422.html
Copyright © 2020-2023  润新知