# -- coding: utf-8 --
"""
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
- 考虑边界
1.末尾为零的int,反转时删除,末尾连续为0,删至不为0为止
2.有符号的,符号保持
3.个位数,直接返回
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
"""
python
1.基于字符串和栈实现
基于字符串处理时,需要注意负数及末尾为0的整数,总体思想:
- 1.将整数转为字符串
- 2.通过栈依次出栈数字字符,拼接字符
- 3.注意:负数处理,末尾为0的处理
主要处理过程为两个一层循环,时间效率O(n),因为需要通过辅助栈处理,需要增加O(n)空间。
def reverse_integer(num):
"""
:param num: int
:return: reverse num
"""
INT_MIN, INT_MAX = pow(-2, 31), pow(2, 31) - 1
if not isinstance(num, int):
return False
if num > INT_MAX or num < INT_MIN:
return False
num2Str = str(num)
n = len(num2Str)
if n == 1 or (n == 2 and num2Str[0] == '-'):
return num
def reverse_handle(start, end, numstr):
stack_ = list(numstr)
newnumstr = ''
for i in range(start, end):
newnumstr += stack_.pop()
count_0 = 0
for i in range(end-start):
if i != '0':
break
elif i > 0 and newnumstr[i] == '0' and newnumstr[i-1] == '0':
count_0 += 1
if newnumstr[i+1] != '0':
break
elif i == 0 and newnumstr[i] == '0':
count_0 += 1
newnumstr = newnumstr[count_0:]
return int(newnumstr)
if n >= 2:
if num2Str[0] == '-':
newnum = reverse_handle(1, n, num2Str)
newnum = -newnum if -newnum >= INT_MIN else False
else:
newnum = reverse_handle(0, n, num2Str)
newnum = newnum if newnum <= INT_MAX else False
return newnum
2.通过整数取模实现
主要思想:
基于十进制整数,通过数学运算获取原整数的每一位,从个位开始获取,根据数位再依次*10,最后获取到反转后的整数,注意输入输出的时候边界判断,另外正数与负数需要注意处理。
本方法主要操作仅包含一层while循环,时间效率O(n),使用的变量也仅常数级别故空间效率O(1)。
def reverse_integer(num):
"""
:param num: int32
:return: int32 reverse
"""
INT_MIN, INT_MAX = pow(-2, 31), pow(2, 31) - 1
if num == 0:
return num
if num < INT_MIN or num > INT_MAX:
return False
neg_flag = False
if num < 0:
neg_flag = True
num = -num
temp = 0
while num > 0:
temp = temp * 10 + num % 10 # 获取余数
num = num // 10 # 获取数位
if neg_flag:
temp = -temp
if temp < INT_MIN or temp > INT_MAX:
return False
return temp