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
标签:10,int,反转,ans,整数,remain,pop,MAX,Leetcode 来源: https://www.cnblogs.com/shawn-young/p/12391592.html