给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
1、字符串翻转
把 x 转为字符串,字符串翻转后转整数,然后返回。
class Solution {
public:
int reverse(int x) {
if (x == INT_MIN) {
return 0;
}
if (x < 0) {
return -reverse(-x);
}
long res = 0;
string str = std::to_string(x);
string res_str;
for (int i = str.size() - 1; i >= 0; --i) {
res_str.push_back(str[i]);
}
res = std::atoi(res_str.c_str());
if (res > INT_MAX) {
return 0;
}
return res;
}
};
2、数学方法
取个位,然后给 res * 10 + 个位。
class Solution {
public:
int reverse(int x) {
if (x == INT_MIN) {
return 0;
}
if (x < 0) {
return -reverse(-x);
}
long res = 0;
while (x > 0) {
int e = x % 10;
x /= 10;
res = res * 10 + e;
}
if (res > INT_MAX) {
return 0;
}
return res;
}
};
// 下面是评论中的方法
int reverse(int x)
{
int max = 0x7fffffff, min = 0x80000000;//int的最大值最小值
long rs = 0;//用long类型判断溢出
for(;x;rs = rs*10+x%10,x/=10);//逆序,正负通吃,不用单独考虑负值
return rs>max||rs<min?0:rs;//超了最大值低于最小值就返回0
}