博客专栏地址:https://blog.csdn.net/feng964497595/category_9848847.html
github地址:https://github.com/mufeng964497595/leetcode
题目描述
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
思路解析
- 最开始想直接简单粗暴转为64位整数来处理,但是题目写了假设环境只能存储32位有符号整数,那就不能这样玩了。。。
- 不考虑溢出问题的话,那很简单,直接搞就完事了:
t m p = x % 10 ; a n s = a n s ∗ 10 + t m p ; tmp = x \% 10; \\ans = ans * 10 + tmp; tmp=x%10;ans=ans∗10+tmp;但是有溢出的问题,就得看算算什么情况下会溢出了:
- 假设x是正数,那么
a n s ∗ 10 + t m p > I N T _ M A X ans * 10 + tmp > INT\_MAX ans∗10+tmp>INT_MAX就是溢出,又因为 t m p < 10 tmp < 10 tmp<10,即
a n s > = I N T _ M A X / 10 ans >= INT\_MAX / 10 ans>=INT_MAX/10如果 a n s > I N T _ M A X / 10 ans > INT\_MAX / 10 ans>INT_MAX/10,那么肯定溢出,直接return 0;
如果 a n s = = I N T _ M A X / 10 ans == INT\_MAX / 10 ans==INT_MAX/10,那么就要加上tmp才会溢出,tmp要大于INT_MAX的个位。又因为INT_MAX的个位是7,所以此时溢出条件是 a n s = = I N T _ M A X / 10 & & t m p > 7 ans == INT\_MAX / 10 \&\& tmp >7 ans==INT_MAX/10&&tmp>7 - 假设x是负数,那么
a
n
s
∗
10
+
t
m
p
<
I
N
T
_
M
I
N
ans * 10 + tmp < INT\_MIN
ans∗10+tmp<INT_MIN就是溢出,又因为
t
m
p
<
−
10
tmp < -10
tmp<−10,即
a
n
s
<
=
I
N
T
_
M
I
N
/
10
ans <= INT\_MIN / 10
ans<=INT_MIN/10如果
a
n
s
<
I
N
T
_
M
I
N
/
10
ans < INT\_MIN / 10
ans<INT_MIN/10,那么肯定溢出,直接return 0;
如果 a n s = = I N T _ M I N / 10 ans == INT\_MIN / 10 ans==INT_MIN/10,那么就要加上tmp才会溢出。而INT_MIN的个位是8,所以此时溢出条件是 a n s = = I N T _ M I N / 10 & & t m p < − 8 ans == INT\_MIN / 10 \&\& tmp < -8 ans==INT_MIN/10&&tmp<−8
示例代码
class Solution {
public:
int reverse(int x) {
int ans = 0;
while (x != 0) {
int val = x % 10;
x /= 10;
if (ans > INT_MAX / 10 || (ans == INT_MAX / 10 && val > 7))
return 0;
if (ans < INT_MIN / 10 || (ans == INT_MIN / 10 && val < -8))
return 0;
ans = ans * 10 + val;
}
return ans;
}
};