美文网首页
leetcode-7. 整数反转

leetcode-7. 整数反转

作者: 简简天天 | 来源:发表于2020-04-05 23:48 被阅读0次

    给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
    示例 1:
    输入: 123
    输出: 321
    示例 2:
    输入: -123
    输出: -321
    示例 3:
    输入: 120
    输出: 21


    image.png

    解题思路一

    1.先判断是否负数,获取符号;
    2.转换$x为字符串,获取字符长度;
    3.循环:根据字符索引替换相应字符位置,循环次数为字符长度的一半(舍弃法取整),即完成了整个字符串的替换;
    4.判断是否溢出;

    <?php
    
    class Solution
    {
        /**
         * 整数反转
         * @param $x
         * @return int|string
         */
        function reverse($x)
        {
            $f = $x < 0 ? '-' : '';//判断正负
            $x = abs($x) . '';// 取绝对值,并且转换成字符串
            $len = strlen($x);// 字符串的长度
            $half = floor(($len-1) / 2);//取一半进行对调
            for ($i = 0; $i < $len; $i++) {
                $target = $len - $i - 1; // 首尾对调
                $tmp = $x[$target];
                $x[$target] = $x[$i];
                $x[$i] = $tmp;
                if ($i == $half) {
                    break; //至此已完成整个字符串字符的位置替换
                }
            }
            $x = intval($f . $x);// 字符串转换成整数
            if ($x > 2147483647 || $x < -2147483646) {
                return 0;
            } else {
                return $x;
            }
        }
    }
    $solution = new Solution();
    echo $solution->reverse(-12340).PHP_EOL;
    echo $solution->reverse(10).PHP_EOL;
    结果:
    -4321
    1
    

    解题思路二

    <?php
    
    class Solution
    {
        /**
         * 整数反转
         * @param $x
         * @return int|string
         */
        function reverse($x)
        {
            if ($x == 0) {//特殊情况
                return $x;
            }
            $y = ltrim(strrev("$x"), 0);//反转且剔除左侧的0
            if ($x < 0) {//负数
                $y = rtrim($y, '-') * -1;//剔除右侧的负号,*-1变成负数
                if ($y < -2147483647) {
                    return 0;
                }
            }
            if ($y > 2147483647) {
                return 0;
            }
            return $y;
        }
    }
    
    $solution = new Solution();
    echo $solution->reverse(-12340) . PHP_EOL;
    echo $solution->reverse(10) . PHP_EOL;
    

    解题思路三

    本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换来解决,第二个思路就是通过数学计算来解决。
    通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。

    <?php
    
    class Solution
    {
        /**
         * 整数反转
         * @param $x
         * @return int|string
         */
        function reverse($x)
        {
            $rev = 0;
            while ($x) {
                if ($x < 0) {
                    $flag = -1;
                } else {
                    $flag = 1;
                }
                $pop = $x % 10;
                $x = intval(floor(abs($x) / 10)) * $flag;
    
                if (($rev > 2147483647 / 10) || (($rev == 2147483647 / 10) && ($pop > 2147483647 % 10))) {
                    return 0;
    
                }
                if (($rev < -2147483647 / 10) || (($rev == -2147483647 / 10) && ($pop < -2147483647 % 10))) {
                    return 0;
                }
                $rev = intval($rev * 10 + $pop);
            }
    
            return $rev;
        }
    }
    
    $solution = new Solution();
    echo $solution->reverse(1534236469) . PHP_EOL;
    echo $solution->reverse(-40) . PHP_EOL;
    echo $solution->reverse(10) . PHP_EOL;
    结果:
    0
    -4
    1
    

    相关文章

      网友评论

          本文标题:leetcode-7. 整数反转

          本文链接:https://www.haomeiwen.com/subject/sfupphtx.html