• 【算法】LeetCode算法题-Reverse Integer


    这是悦乐书的第143次更新,第145篇原创

    01 看题和准备

    今天介绍的是LeetCode算法题中Easy级别的第2题(顺位题号是7),给定32位有符号整数,然后将其反转输出。例如:

    输入: 123
    输出: 321

    输入: -123
    输出: -321

    输入: 120
    输出: 21

    给定反转整数范围: [−2^31, 2^31 − 1],即在int的最小值、最大值之间,如果反转整数超过此范围,则返回0。

    本次解题使用的开发工具是eclipse,jdk使用的版本是1.8,环境是win7 64位系统,使用Java语言编写和测试。

    02 分析题目

    首先,特许情况是输入值为0,可以直接输出0。
    第二步,因为会后负数出现,先判断是否为负数,留下标记,因为处理数据的过程中,操作正数方便于操作负数,这里利用Math.abs()函数取绝对值。
    第三步,反转数据。例如: 1223 取反为 3221

    最后一位数 = 1223%10 = 3
    倒数第二位数 = 122%10 = 2, 其中122是1223除以10后的数
    倒数第三位数 = 12%10 = 2, 其中12是122除以10后的数
    倒数第四位数 = 1%10 = 1, 其中1是12除以10后的数
    拿到反转的数 31000 + 2100 + 210 + 1 = 3221

    可以进一步分析反转的数是怎么来的:

    0x10 + 3 = 3
    3x10 + 2 = 32
    32x10 + 2 = 322
    322x10 + 1 = 3221
    反转的数是原数对10取余的余数从个十百位依次向前移动 加上 新的余数

    第四步,判断是否超出范围,是则返回0,否则判断符号标记,还原符号。对于还原符号的操作,可以直接加上“-”号,也可以用0减反转后的数,也可以利用Math.negateExact()函数。

    public int reverse(int x) {
        int result = 0;
        if (0 == x) {
            return 0;
        }
        boolean flag = false;
        if (x < 0) {
            flag = true;
        }
        int tem = Math.abs(x);
        long afterreverse = 0;
        while (tem > 0) {
            afterreverse = afterreverse*10 + tem%10;
            tem /= 10;
        }
        if (flag) {
            afterreverse = 0 - afterreverse;
        }
        if (afterreverse > Integer.MAX_VALUE || afterreverse < Integer.MIN_VALUE) {
            result = 0;
        } else {
            result = (int)afterreverse;
        }
        return result;
    }
    

    03 取巧的解法

    将其转为字符串,利用StringBuilder类的reverse()方法,省去循环处理整数的步骤。

    public int reverse2(int x) {
        if (0 == x) {
            return 0;
        }
        String flag = "";
        if (x < 0) {
            flag = "-";
        }
        String str =  String.valueOf(Math.abs(x));
        StringBuilder sb = new StringBuilder(str);
        String afterreverse = sb.reverse().toString();
        if (afterreverse.length() >10) {
            return 0;
        }
        long x_reverse = Long.parseLong(flag+afterreverse);
        if (x_reverse > Integer.MAX_VALUE || x_reverse < Integer.MIN_VALUE) {
            x_reverse = 0;
        }
        return (int)x_reverse;
    }
    

    04 小结

    本题需要注意的是符号和反转后是否会溢出的情况,其次尾数是0的情况,在两种解法中都涵盖进去了,不需要额外考虑。
    如果大家有什么好的解法思路、建议或者其他问题,可以下方留言交流,点赞、留言、转发就是对我最大的回报和支持!

    本文首发于我的个人公众号:悦乐书,转载请注明出处!

  • 相关阅读:
    VUE2.0项目实现动态修改请求的服务器地址
    el-select和data
    el-tree禁用
    国际化全部整理
    洛谷P2899 Cell Phone Network G 题解
    【nvidia jetson xavier】 Deepstream Yolov3示例模型运行
    【nvidia jetson xavier】 风扇开机自启动
    A Semisupervised CRF Model for CNN-Based Semantic Segmentation With Sparse Ground Truth
    Semi-supervised semantic segmentation needs strong, varied perturbations
    Remote Sensing Images Semantic Segmentation with General Remote Sensing Vision Model via a Self-Supervised Contrastive Learning Method
  • 原文地址:https://www.cnblogs.com/xiaochuan94/p/9795980.html
Copyright © 2020-2023  润新知