LeetCode:7. 整数反转

题目

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

示例 1:

输入: 123
输出: 321

示例 2:

输入: -123
输出: -321

示例 3:

输入: 120
输出: 21

注意:

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

1. 字符串解法

class Solution():
    def reverse(self, x):
        t=abs(x)
        s=str(t)[::-1]
        if x<0:
            y=-int(s)
        else:
            y=int(s)
        if (-2)**31 < y<(2**31-1):
            return y
        else:
            return 0

先变量x取绝对值存放在新变量t中,将t转换成字符串,再对字符串反转,再将反转后的字符串转换成整数,如果x<0再对转换成的整数取相反数,最后判断转换后的整数是否溢出。

对上述方法进行代码的简化,代码更加简洁:

class Solution():
    def reverse(self, x):
    	t=abs(x)
        y = int(str(t)[::-1]) if x>0 else -int(str(t)[::-1])
        return y if -2**31 < y < 2**32-1 else 0

PS:字符串反转的方法
(1) 用字符串切片

s='123'
result = s[::-1]
print(result)

s[ : : -1]相当于 s[-1:-len(s)-1:-1],也就是从最后一个元素到第一个元素复制一遍,即倒序
(2) 利用列表的reverse

s='123'
l = list(s)
l.reverse()
result = "".join(l)
print(result)

先转换为列表,再利用列表的reverse方法进行反转,最后用join方法用""空字符将其连接

2. 取余解法

class Solution():
    def reverse(self, x):
        X=abs(x)
        
        z=0
        while X>0:
            y=X%10
            X=X//10
            z=z*10+y
            
        if x<0:
            z=-z
        return z if (-2)**31 < z<(2**31-1) else 0

先变量x取绝对值存放在新变量X(大写)中,利用while循环对X进行翻转,过程如下图所示:
在这里插入图片描述

将12345 % 10 得到5,之后将12345 // 10
将1234 % 10 得到4,再将1234 // 10
将123 % 10 得到3,再将123 // 10
将12 % 10 得到2,再将12 // 10
将1 % 10 得到1,再将1 // 10

同样,如果x<0再对转换成的整数取相反数,最后判断转换后的整数是否溢出。
PS

  • 对于Python符号/得到的结果为浮点数,整除需要使用//
  • Python用%取余时,余数符号由被除数决定,取余结果为向下取余,即取较小的商
    比如:
    5%-3,向下取余的话,商应该为-2,所以余数为-1,余数为负
    -5%3,向下取余的话,商应该位-2,所以余数为1,余数为正
    -5%-3,向下取余的话,商应该为1,所以余数为-2,余数为负
    5%3,向下取余的话,商应该为1,所以余数为2,余数为负

3. 取余解法调整

为了防止在while循环中z的值溢出,需要在循环执行时判断z值的大小

class Solution():
    def reverse(self, x):
        X=abs(x)
        z=0
        
        while X>0:
            y=X%10
            X=X//10
            if x<0 and (-z<-214748364 or (-z==-214748364 and y>8)):
                return 0
            if x>0 and (z>214748364 or (z==214748364 and y>7)):
                return 0
            z=z*10+y
            
        if x<0:
            z=-z
        return z    
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页