题目:
给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
解答:
Approach #1. 把int转成string,再转换回来:
class Solution {
public:
int reverse(int x) {
string str = to_string(x);
if (str[0] == '+' || str[0] == '-') {
std::reverse(str.begin() + 1, str.end());
}
else {
std::reverse(str.begin(), str.end());
}
istringstream num(str);
int i;
num >> i;
//测试了一下,他这里如果溢出会给INT_MAX或INT_MIN
//考虑到此题中转换后的数字不可能是INT_MAX或INT_MIN
if (i == 2147483647 || i == -2147483648) {
return 0;
}
return i;
}
};
Approach #2. 直接用数学方式:
举个栗子:
对于一个正数(ps:负的怎么办?记录一下再变成正的,最后把符号拿回来),现在要把它变成
,由于:
即:
于是可以设置一个变量,将
初始化成
,接下来在获取倒数第i位
的同时,令:
具体实现如下:
class Solution {
public:
int reverse(int x) {
if (x == INT_MIN) {
return 0;
}
bool isNegetive = x < 0? true : false;
if (isNegetive) {
x = -x;
}
long result = x % 10;
while ((x /= 10) != 0) {
int last = x % 10;
//上面写了一堆,就为了这一句
result = 10 * result + last;
}
if (isNegetive) {
result = -result;
}
if (result < INT_MIN || result > INT_MAX) {
return 0;
}
return result;
}
};
/*
只能说自己水平不够,连这个都要搞半天。
*/