算法本身并没有多少难度,难点是对于边界条件的判断,以及一些小的陷阱。具体需要注意的细节,我们写在代码注释中。
#include <iostream>
using namespace std;
class Solution {
public:
int reverse(int x) {
long long tmp = x, result = 0; // 把tmp设为long long类型,那么当x为-2147483648时, -tmp就不会越界,设想假如tmp为int类型,则-tmp > 2147483647,就会发生类型数值越界。设置result为long long类型的好处就是在do while循环计算result时,永远不会担心result类型数值越界。
bool ifNeg = false; // 通过ifNeg来标志x是否为负数
if (tmp < 0) {
tmp = -tmp;
ifNeg = true;
}
// cout << tmp << "\n";
do {
result = result*10 + tmp%10;
tmp /= 10;
} while (tmp);
// if中的语句,需要特别小心。注意:直接比较两个不同类型的数时,常常会出现一些不正确结果。处理方法为,将低类型强制转化为高类型,比如在这里将int转化为long
if ((!ifNeg && result > INT32_MAX) || (ifNeg && result > -(long long)INT32_MIN)) {
return 0;
} else if(ifNeg) {
return -(int)result;
} else {
return (int)result;
}
}
};
int main(int argc, const char * argv[]) {
Solution S;
cout << S.reverse(-2147483648) << endl;
return 0;
}