算法练习-整数反转

233 阅读3分钟

一、介绍

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231,  231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321
示例 2:

输入:x = -123
输出:-321
示例 3:

输入:x = 120
输出:21
示例 4:

输入:x = 0
输出:0

来源:力扣(LeetCode) 链接:leetcode.cn/problems/re… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

思路:

  • 首先,提取公共的部分,有符号正数的范围[−231, 231 − 1], 如果超出了就返回0,定义返回的值0
  • 这里要定义最大值231 - 1,最小值-231,如果超出这个返回就返回0
  • 思路就是通过取余数,拿到最后一位,然后在把最后一位乘以10
  • 这里先123,先取123的余数为3,这时拿到了倒叙的第一个值,但是还要对原值进行处理
  • (123 - 3) // 10,这时得到的到值就是下次处理的参数12
  • 同时这里也要计算返回值返回值等于返回值乘以10,再加上最后的除以余数的值
  • result = result * 10 + last
  • 这里是定义循环的判断条件就是不等于0
  • 这里如果取的值为负值的话,就需要在单独处理一部分数据,比如-123
  • 这里取余数,-123%10的余数是7,如果因为要处理参数的最后一位,
  • 那么就要判断当前如果是负数,取到的余数要-10,那么就得到了处理后的数据-120,
  • 之后就还按照之前的处理,先除以10,然后在重新定义返回值,最后通过循环,得到最后的值

三、代码执行

class Solution:
    def resulterse(self, x: int) -> int:
        """
        思路:
            首先,提取公共的部分,有符号正数的范围[−231,  231 − 1], 如果超出了就返回0,定义返回的值0
            这里要定义最大值2**31 - 1,最小值-2**31,如果超出这个返回就返回0
            思路就是通过取余数,拿到最后一位,然后在把最后一位乘以10
            这里先123,先取123的余数为3,这时拿到了倒叙的第一个值,但是还要对原值进行处理
            (123 - 3) // 10,这时得到的到值就是下次处理的参数12
            同时这里也要计算返回值返回值等于返回值乘以10,再加上最后的除以余数的值
            result = result * 10 + last
            这里是定义循环的判断条件就是不等于0

            这里如果取的值为负值的话,就需要在单独处理一部分数据,比如-123
            这里取余数,-123%10的余数是7,如果因为要处理参数的最后一位,
            那么就要判断当前如果是负数,取到的余数要-10,那么就得到了处理后的数据-120,
            之后就还按照之前的处理,先除以10,然后在重新定义返回值,最后通过循环,得到最后的值

        :param x:
        :return:
        """
        INT_MIN, INT_MAX = -2**31, 2 ** 31 - 1
        result = 0
        while x != 0:
            if result < INT_MIN // 10 + 1 or result > INT_MAX // 10:
                return 0
            last = x % 10
            if x < 0 and last > 0:
                last -= 10
            x = (x - last) // 10
            result = result * 10 + last
        return result


if __name__ == '__main__':
    x = -123
    mm = Solution()
    ss = mm.resulterse(x)
    print(ss)

四、 测试结果

image.png