整数反转,需要一个中间变量 a n s ans ans , 循环存入 x x x 的最低位 x % 10 x\%10 x%10, 然后 x = x / 10 x = x/10 x=x/10 ,得到 x x x 新的最低位 。如果进入新的循环, a n s × 10 ans\times 10 ans×10 ,让上一次的 a n s ans ans 十进制左移一位。重复上述操作,即可得到 a n s ans ans 。
因为这题有整形溢出问题,这里使用 l o n g l o n g long~long long 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 ( l o g n ) O(logn) O(logn) , n n n 是 x x x 的大小,时间复杂度 O ( l o g 10 n ) O(log_{10}n) O(log10n)。
空间复杂度 O ( 1 ) O(1) O(1) 除若干变量使用的常量级空间,没有使用额外的线性空间。
题目限制,必须使用
i
n
t
int
int 存数 。 考虑正数溢出条件, 发生在
a
n
s
∗
10
+
x
%
10
>
I
N
T
_
M
A
X
ans * 10 + x \%10>INT\_MAX
ans∗10+x%10>INT_MAX 的情况下,
推导可得,
a
n
s
>
I
N
T
_
M
A
X
−
x
%
10
10
ans>\dfrac{INT\_MAX - x\%10}{10}
ans>10INT_MAX−x%10 的情况下,整形溢出。
同理,负数溢出发生在 a n s < I N T _ M I N − x % 10 10 ans<\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 ( l o g n ) O(logn) O(logn) , n n n 是 x x x 的大小,时间复杂度 O ( l o g 10 n ) O(log_{10}n) O(log10n)。
空间复杂度 O ( 1 ) O(1) O(1) 除若干变量使用的常量级空间,没有使用额外的线性空间。
理解思路很重要!
欢迎读者在评论区留言,作为日更博主,看到就会回复的。