让我们一起啃算法----整数反转

整数反转(Reverse-Integer)

这是一个比较简单的题目,题干如下:

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
  输入: 123
  输出: 321
示例 2:
  输入: -123
  输出: -321
示例 3:
  输入: 120
  输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣

我觉得这个题目的考点在于让你有个意识:数字类型是有可能溢出的。

解题思路

这个题整体的思路就是:与10取模,再与10相除取整,往复循环直至目标值为0,流程图如下:

其中需要注意点有两个:

  • 负数和正数其实不用分类讨论,例如 -12310 取模得到的值是 -3,与正数的处理逻辑是一致。
  • 溢出的判断,我这里采用了一个 倒推思路 :例如 C = A + B,那么如果没有溢出 可以得到 A = C - B,但是溢出了就 得到 A != C - B

具体的代码实现

GO语言实现:(建议配合上面的解题思路看代码)

func reverse(x int) int {
    var (
        result = 0
    )
    // x为正负数不用分类讨论。
    // 因为:-123 % 10 = -3,与正数的处理逻辑一致
    for x != 0 {
        mod := x % 10
        newResult := result*10 + mod
        // 倒推思路: C = A + B,如果没有溢出 A = C - B,溢出之后 A != C - B
        if (newResult-mod)/10 != result {
            return 0
        }

        result = newResult

        // 去掉最后一位
        x = x / 10

    }
    return result
}

总结

每天进步一点点,加油!
算法教程项目,每天更新一题,点个 star 支持一下呀
https://github.com/wx-satellite/learning-a...

本作品采用《CC 协议》,转载必须注明作者和本文链接
三斤
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
function reverseNum($num) {
    $result = 0;
    while ($num !== 0) {
        $mod = $num % 10;
        $newResult = $result * 10 + $mod;
        if (($newResult - $mod) / 10 !== $result) {
            return 0;
        }

        $result = $newResult;
        $num = (int) ($num / 10);
    }

    return $result;
}
echo reverseNum(123); // ouput: 321
echo reverseNum(120); // ouput: 21

继续加上了php 实现

4年前 评论
三斤和他的喵 (楼主) 4年前
function reverse($x) {
        if(!is_int($x)) return 'error in type';
        $remainder = 0;//余数
        $res = 0;
        while($x > 9){
            $remainder = $x%10; //获取余数
            $x = ($x-$remainder)/10;//初始化传进来的变量
            $res = $res*10+$remainder;
        }
        return $res*10+$x;
    }
4年前 评论
三斤和他的喵 (楼主) 4年前
yzh52521 (作者) 3年前
lochpure
/*
*先判断是否大于0,如果大于0,使用abs函数返回绝对值,如果小于0,就在前面加一个‘-’号
*/
function reverse($x) {
        if ($x>0) {
            $num = abs(strrev($x));
         }else{
            $num = -strrev($x);
         }
         if ($num< pow(-2,31) || $num> (pow(2,31)-1)) {
             $num = 0;
         }
         return $num;
    }
3年前 评论
三斤和他的喵 (楼主) 3年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!