【求知=>算法】整数反转
给你一个 32 位的有符号整数x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
解题思路
- 数组切片
- 将整数转成字符串类型定义为s。
- 如果零号下标等于负一,输出新的字符串负一加反转后的字符串,反正直接输出反转的字符串。
- 将字符串转成整型,然后根据提示
-2**31 <= x <= 2**31 - 1,进行输出,反正返回0。
# 转换成string后翻转string再转化回来。str对int转化,和str切片都是O(n)。
def reverse():
x = -123
s = str(x)
if s[0] == '-':
s_rev = s[0] + s[-1:-len(s):-1]
else:
s_rev = s[::-1]
x_rev = int(s_rev)
if -2 ** 31 <= x_rev <= 2 ** 31 - 1:
return x_rev
return 0
- 双指针思路
- 将整型转换成集合类型并定义为s。
- 然后判断是否第一个输出是否是负一,如果是负一,总长度减去一并且整除遍历,重新复值开始值和结束值,反之判断第一个输出不是负一,总长度整除遍历,重新复值开始值和结束值。
- 将字符串转成整型,然后根据提示
-2**31 <= x <= 2**31 - 1,进行输出,反正返回0。
x = -123
t = list(str(x)) # 数字转换成字符串
n = len(t)
left = n - 1
right = 1
right2 = 0
if t[0] == '-':
for i in range((n - 1) // 2):
t[right], t[left] = t[left], t[right]
right += 1
left -= 1
tt = int(''.join(t))
if tt <= (2 ** 31 - 1) and tt >= (-2 ** 31):
return tt
else:
return 0
else:
if n == 1:
return x
else:
for j in range(n // 2):
t[right2], t[left] = t[left], t[right2]
right2 += 1
left -= 1
tt = int(''.join(t))
if tt <= (2 ** 31 - 1) and tt >= (-2 ** 31):
return tt
else:
知识扩展
博客来源:雨夜的博客