题目
给出一个 32 位的有符号整数,将这个整数中每位上的数字进行反转
例子
- 123 -> 321
- -123 -> -321
- 120 -> 21
- 0 -> 0
假设
- 输入的整数范围位于
-2^31
到2^31-1
范围内
tips
- 将整数转化为字符串进后进行处理
- 不借助字符串,仅利用除法,取模操作完成
答案
解法1:
def reverse(x):
if -10 < x < 10:
return x
str_x = str(x)
if str_x[0] != "-":
str_x = str_x[::-1]
x = int(str_x)
else:
str_x = str_x[:0:-1]
x = int(str_x)
x = -x
return x if -2147483648 < x < 2147483647 else 0
性能
- 时间复杂度O(n)
- 空间复杂度O(n)
关键点
- 转为字符串处理
- 考虑溢出的情况
解法2:
def reverse(x):
y, res = abs(x), 0
# 则其数值范围为 [−2^31, 2^31 − 1]
boundry = (1<<31) -1 if x>0 else 1<<31 # 2147483648-1, 2147483648
while y != 0:
res = res*10 +y%10
if res > boundry :
return 0
y //=10
return res if x >0 else -res
性能
- 时间复杂度log10(n)
- 空间复杂度O(1)
关键点
- 利用除法和取模运算
- 考虑溢出的情况
解法3:
def reverse_str(x):
"""
1. 判断x的正负
2. 提取x每一位数字存储在列表
3. 然后使用按权值相加
:param x:
:return:
"""
x = str(x)
flag = True # 表示正负
if x[0] == '-':
flag = False
x = x[1:]
x = x[::-1]
result = int(x)
if not flag:
result = -result
return result
性能
- 时间复杂度log10(n)
- 空间复杂度O(1)
关键点
- 利用字符串实现符号判断和反转