给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
自己思路的解答如下。这里是为了练习链表的使用,其实用vector啥的也行。
class Solution {
public:
int reverse(int x) {
long res = 0; //结果可能超出int边界
//不需要对负数特殊操作
list<int> nums;
list<int>::iterator iter;
while (x != 0) { //依次存放每一位数据至nums
nums.push_back(x % 10);
x = x / 10;
}
for (iter = nums.begin(); iter != nums.end(); iter++) {
res = res * 10 + *iter;
} //练习迭代器的使用,这里扮演类似指针的角色
if (res<INT_MIN || res>INT_MAX)
return 0; //对溢出的结果返回0
return res;
}
};
参考题解的解答如下。在一个循环体内可以同时实现两个计算。
class Solution {
public:
int reverse(int x) {
int res = 0;
while (x != 0) {
if (abs(res) > INT_MAX / 10) return 0; //直接判断是否溢出
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
};
关于INT_MIN和INT_MAX:
//define INT_MAX = 2147483647
//define INT_MIN = -INT_MAX - 1
int main()
{
cout << "2^31-2 = " << int (pow(2, 31) - 2) << endl;
cout << "2^31-1 = " << int (pow(2, 31) - 1) << endl;
cout << "-2^31 = " << int (- pow(2, 31)) << endl << endl;
cout << "INT_MAX = " << INT_MAX << endl;
cout << "INT_MIN = " << INT_MIN << endl;
return 0;
}