Leetcode--整数反转(7)

题目描述:

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

示例:输入:123  输出:321  输入:-123  输出:-321(输入和输出都为int型)

思路一:比较简单粗暴。首先把输入的整型转换为字符串,分输入为正和输入为负两种情况,使用切片对字符串进行倒序输出。整数溢出单独用if语句表示即可。

class Solution:
    def reverse(self, x: int) -> int:
        MAX = 2**31 -1
        MIN = -2**31    
        x_string = str(x)
        ans = 0
        if x >= 0:
            ans = int(x_string[::-1])
        else:
            ans = -int(x_string[:0:-1])
        if ans > MAX or ans < MIN:
            return 0
        return ans

时间复杂度:o(log(x))  (因为x的位数大概为log10(x))  空间复杂度:O(1)

注意:切片的使用[start:end:step]  step为正时,从左往右切片;step为负时,从右往左切片。

      


思路二:利用了栈的思想。循环弹出输入x的最后一位数字,并将其推入变量remain的最前面。最终得到的remain则于原输入x相反。

关于正负号的处理:先利用绝对值函数,得到|x|,输出的时候判断是否需要加上负号

(1)弹出x的最后一位: pop = x%10;x = x/10

  (2)  temp = remain*10 + pop;remain = temp

  (3) 判断输出是否溢出: 如果temp = remain*10 + pop会导致溢出,那么remain ≥ MAX/10;且由于2^31-1的最后一位是7,因此,当remain == MAX/10时,若pop>7也会造成溢出。

class Solution:
    def reverse(self, x: int) -> int:
        MAX = 2**31 -1
        MIN = -2**31
        remain = 0
        y = abs(x)
        while(y != 0):
            pop = y % 10
            y //= 10
            if (remain > MAX//10 or (remain == MAX//10 and pop > 7)):
                return 0
            remain = remain * 10 + pop
        return remain if x > 0 else -remain

时间复杂度:o(log(x))   空间复杂度:O(1)

这里有个使用python会出现的坑:python中/表示精确除法(即结果为浮点数);而“//”表示地板除,结果向下取整,即返回不大于准确结果的最大正整数

//的特殊情况:(1)两个数中只要存在有浮点数,3//2.0 = 1.0 (2)负数除以正整数得到负数本身:-1//2.0 = -1   (3)负数除以负数 ,结果为0   -1//-4 = 0

猜你喜欢

转载自www.cnblogs.com/shawn-young/p/12391592.html