题目的主要信息:
- 给定一个32位的有符号整数num,将num中的数字部分反转
- 只反转数字部分,符号位部分不反转
- 最后的结果需要在32位有符号数范围之内,超出范围返回0
方法一:取模反转
具体做法:
数对10取余可以得到数字最后一位,将最后一位加在答案数字最前面,然后数除10即可去掉最后一位数字,后续继续取余,添加到答案数字后,答案数字添加前先乘10,空出最后一位给要加的数字,如图所示:
因此对答案数字乘10加上余数后可能会超过范围,因此在乘10之前要比较答案数字是否超过了INT型整数最大最小值的1/10,处理溢出。
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x){
int mod = x % 10; //取最低位数字
x /= 10; //去掉最低位数字
if(res > INT_MAX / 10 || res < INT_MIN / 10) //处理溢出
return 0;
res = res * 10 + mod; //低位数字在前组装
}
return res;
}
};
复杂度分析:
- 时间复杂度:,相当于连除十进制数字的位数,而位数就是取10的对数
- 空间复杂度:,常数级变量,无额外空间
方法二:python字符串反转
具体做法:
可以使用python将数字转成字符串,然后对字符串进行反转,添加符号后转回int型数字,因此python的int数字不会越界,此时比较数字是否在32位有符号数范围内,如果在正常输出,否则输出0.
class Solution:
def reverse(self , x: int) -> int:
s = str(abs(x)) #数字转字符串
s = s[::-1] #字符串反转
if x < 0: #判断正负
s = '-' + s
res = int(s) #字符串转数字
if res >= (-2 ** 31) and res <= (2 ** 31 - 1): #合法范围内
return res
else:
return 0
复杂度分析:
- 时间复杂度:,字符串长度相当于十进制数字的位数,而位数就是取10的对数,一次反转字符串,因此为
- 空间复杂度:,使用了数字位数为长度的字符串空间