模拟
整数反转,需要一个中间变量 ansansans , 循环存入 xxx 的最低位 x%10x\%10x%10, 然后 x=x/10x = x/10x=x/10 ,得到 xxx 新的最低位 。如果进入新的循环,ans×10ans\times 10ans×10 ,让上一次的 ansansans 十进制左移一位。重复上述操作,即可得到 ansansans 。
朴素解法
因为这题有整形溢出问题,这里使用 long longlong~longlong long 仅演示上述操作,在下一个解法分析边界。
class Solution {
public:
int reverse(int x) {
long long ans = 0;
while(x){
ans*=10;
ans +=x%10;
x/=10;
}
if(ans>INT_MAX||ans<INT_MIN) return 0;
return ans;
}
};
时间复杂度 O(logn)O(logn)O(logn) , nnn 是 xxx 的大小,时间复杂度 O(log10n)O(log_{10}n)O(log10n)。
空间复杂度 O(1)O(1)O(1) 除若干变量使用的常量级空间,没有使用额外的线性空间。
整型解题
题目限制,必须使用 intintint 存数 。 考虑正数溢出条件, 发生在 ans∗10+x%10>INT_MAXans * 10 + x \%10>INT\_MAXans∗10+x%10>INT_MAX 的情况下,
推导可得,ans>INT_MAX−x%1010ans>\dfrac{INT\_MAX - x\%10}{10}ans>10INT_MAX−x%10 的情况下,整形溢出。
同理,负数溢出发生在 ans<INT_MIN−x%1010ans<\dfrac{INT\_MIN - x\%10}{10}ans<10INT_MIN−x%10 的情况下。设置边界 , 本题得解。
class Solution {
public:
int reverse(int x) {
int ans = 0;
while(x){
if(x>0 && ans > (INT_MAX - x%10)/10) return 0;
if(x<0 && ans < (INT_MIN - x%10)/10) return 0;
ans*=10;
ans +=x%10;
x/=10;
}
return ans;
}
};
时间复杂度 O(logn)O(logn)O(logn) , nnn 是 xxx 的大小,时间复杂度 O(log10n)O(log_{10}n)O(log10n)。
空间复杂度 O(1)O(1)O(1) 除若干变量使用的常量级空间,没有使用额外的线性空间。
博主致语
理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。
AC

本文详细介绍了整数反转算法的实现方法,包括使用long long类型处理整数溢出问题的朴素解法,以及如何在使用int类型时通过精确判断避免溢出的方法。文章通过具体的代码示例展示了算法的具体步骤。
655

被折叠的 条评论
为什么被折叠?



