图解算法:整数反转

2,552 阅读2分钟

本文首发于公众号「猿天罡」,转载请注明出处

个人网站:liuwynn.github.io

本题源自 LeetCode ,题号7。

1.题目描述

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

2.解题思路

题目的意思是:给定我们一个整数,让我们经过算法求解以后,返回给定整数的逆序整数,如给定 123,返回 321,值得注意的是,题目最后提醒了一下反转之和整数可能溢出的问题。

具体思路如下:

  1. 假设给定整数为 X,我们都知道,X / 10的值等于商的整数部分,X % 10的值等于余数部分。

  2. 如果 X 是个位数,就直接返回即可;

  3. 否则,我们就进入循环,当 X 最终变为个位数时,循环结束,循环过程如下:

    1. 我们设置一个变量 reverseX 来接收X的逆序值,初始赋值为0;

    2. 然后把 reverseX 保存的值升一位(乘以10),再加上 X除以10的余数部分;

    3. 接着把 X除以10的商的整数部分赋值给X;

    4. 重复执行步骤2和步骤3,直至循环结束。

  4. 循环结束后,reverseX 再加上 X 的值即为最终结果。

3.算法动画

假设给定整数值 X 为 123,依照上面给出的解题思路,运行过程如下:

图解整数反转

4.代码实现

个人精力有限,暂时只提供 Java 代码实现,后续可能会加入其他语言的实现代码,敬请期待哦~

4.1 Java实现

class Solution {
    public int reverse(int x) {
        long reverseX = 0;
        while ((x / 10) != 0) {
            reverseX = reverseX * 10 + (x % 10) * 10;
            x = x / 10;
        }
        reverseX += x;
        return (reverseX > Integer.MAX_VALUE || reverseX < Integer.MIN_VALUE) ? 0 : (int) reverseX;
    }
}

5.结尾语

算法是计算机编程的灵魂,就算这个灵魂是不太好理解的亚子,所以我想通过绘制动画的方式,让同学们能感受到算法的青春和活力。

如果你觉得本文对你有所帮助的话,欢迎扫码关注公众号「猿天罡」。

公众号猿天罡