7. 整数反转

2021-03-22  本文已影响0人  简_爱SimpleLove

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。

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

第一种算法

自己未看答案前自己写的。主要思路是:转成字符串逆序遍历,前面的0不拼接,如果有负号,最后再拼接到字符串前面,然后再将字符串转成整数。

def reverse1(x):
    if x == 0:
        return x
    s = str(x)
    n = len(s)
    rs = ""
    # 当出现第一位数字的时候,后面的0就需要添加上了
    add_zero = False
    for i in range(n):
        if s[n-1-i] != "0" and s[n-1-i] != "-":
            rs += s[n-1-i]
            add_zero = True
        if add_zero and s[n-1-i] == "0":
            rs += "0"

    if s[0] == "-":
        rs = "-" + rs

    if int(rs) < -(2 ** 31) or int(rs) > (2 ** 31 - 1):
        return 0
    else:
        return int(rs)

第二种算法

参考力扣精选答案和评论。我们只需要每次对 整数%10,就能得到末尾的数字,然后再将整数等于 整数/10 就能得到排除最后一位的新的整数。

def reverse2(x):
    n = 0
    ox = x
    x = abs(x)
    while x != 0:
        n = n * 10 + x % 10
        x = x // 10

    n = n if ox > 0 else -n
    if n < -(2 ** 31) or n > (2 ** 31 - 1):
        return 0
    else:
        return n

因为Python对于负数整除10的操作和别的语言不太一样,不方便计算,而且Python的底层是由C语言写的解释型语言,所以运行速度始终赶不上C语言它们。

最简单的C语言代码如下:

int reverse(int x)
{
    long n = 0;
    while (x)
    {
        n = n * 10 + x % 10;
        x /= 10;
    }
    return n > INT_MAX || n < INT_MIN ? 0 : n;
}
复杂度分析
上一篇下一篇

猜你喜欢

热点阅读