给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为
[−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题目很简单,直接上代码:
class Solution
{
public:
int reverse(int x)
{
if (!x)
{
return 0;
}
vector<long> nums;
long temp;
bool b = x > 0 ? 1 : 0; //标记符号
long long_x = x;
if (!b)
{
long_x = -long_x; //取绝对值
}
while (long_x)
{
temp = long_x % 10;
long_x /= 10;
nums.push_back(temp);
}
for (int i = 0; i < nums.size(); ++i)
{
long_x = long_x * 10 + nums[i];
}
if (long_x > (long(1) << 31) - 1
|| long_x < -(long(1) << 31)) //注意long的位置
//if (long_x > long(1 << 31) - 1
//|| long_x < -long(1 << 31))
{
return 0;
}
if (b == 0)
{
long_x = -long_x; //加上原本的符号
}
return long_x;
}
};
思路很简单,把原数x的每个数位拿出来,然后再相应地乘以倒序后的权值就可以了。值得注意的有一个地方,就是注释掉的那行代码,注意比较long转型的时机,如果位移完成之后再转型,那么位移完成的数已经溢出了,再转型就没有意义了,因此要对1转型。
更简洁的代码如下:
class Solution
{
public:
int reverse(int x)
{
long long res = 0;
while(x)
{
res = res * 10 + x % 10; //无论正负都可以
x /= 10;
}
return (res < INT_MIN || res > INT_MAX) ? 0 : res;
}
};