难度:简单
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题目分析:
主要考虑溢出的情况,如果直接使用stoi函数转换成string,会有问题,因为stoi输入的最大值就是int的最大值。所以干脆使用long long int来存储结果,在和int的最大值和最小值比较。这边还有个问题就是不需要做取余(%)和除法(/)运算,不需要考虑正负号,直接做运算即可。
错误代码:
class Solution {
public:
int reverse(int x) {
string str = "2147483647";
int data;
if (x < 0)
{
x = abs(x);
string x_str = to_string(x);
string res;
for (int i = x_str.size() - 1; i >= 0; --i)
{
res += x_str[i];
}
if (str.size() == res.size() && str < res)
return 0;
else
{
data = -stoi(res);
return data;
}
}
else if (x > 0)
{
string x_str = to_string(x);
string res;
for (int i = x_str.size() - 1; i >= 0; --i)
{
res += x_str[i];
}
if (str.size() == res.size() && str < res)
return 0;
else
{
return stoi(res);
}
}
else
{
return 0;
}
}
};
参考代码:
class Solution {
public:
int reverse(int x) {
long long rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX || rev < INT_MIN) return 0;
rev = rev * 10 + pop;
}
if (rev > INT_MAX || rev < INT_MIN) return 0;
return rev;
}
};