7. 整数反转
题目介绍
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解
反转整数有两个思路,一个是转字符串进行反转,但是效率较低;第二个是在循环内每次将整数的个位数加给另一个数。
问题的关键在于怎么解决溢出的问题,如果题目没有规定不可以使用超过32位整数的话,可以直接使用long进行存储数字最后做一次判断。
不可以在计算结束后进行判断,必须要在每次加法之前进行判断,需要判断当前是数 n n n和余数 k k k二者相加是否会造成溢出。
假如为正数,则溢出为
n
∗
10
+
k
>
n*10+k>
n∗10+k>INT_MAX,
有两种情况,第一种是
n
=
n=
n=INT_MAX
/
/
10
//10
//10,
k
>
k>
k>INT_MAX
%
10
\%10
%10;
第二种是
n
>
n>
n>INT_MAX
/
/
10
//10
//10。
假如为负数,则溢出为
n
∗
10
+
k
<
n*10+k<
n∗10+k<INT_MIN,
有两种情况,第一种是
n
=
n=
n=INT_MIN
/
/
10
//10
//10,
k
<
k<
k<INT_MIN
%
10
\%10
%10;
第二种是
n
<
n<
n<INT_MIN
/
/
10
//10
//10。
#include <climits>
class Solution {
public:
int reverse(int x) {
int n=0;
int k;
while(x)
{
k = x%10;
if((n==INT_MAX/10 && k>INT_MAX%10) || n > INT_MAX/10)
{
return 0;
}
else if((n==INT_MIN/10 && k<INT_MIN%10) || n < INT_MIN/10)
{
return 0;
}
n = k + n*10;
x = x/10;
}
return n;
}
};