题目:给你一个 32 位的有符号整数 x ,返回 x 中每位上的数字反转后的结果。如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123
输出:321
示例 2:
输入:x = -123
输出:-321
示例 3:
输入:x = 120
输出:21
示例 4:
输入:x = 0
输出:0
提示:
-231 <= x <= 231 - 1
思路:
- 通过对x进行%10可以得到末位数字,将其得到的末位数字放入result首位。完成一次操作后result*=10; x/=10;不断循环,循环条件是x>0。
- 此时发现x经过反转后可能会溢出,因此需要对其进行溢出判断。常规的做法是为了防止溢出使用long存储,若大于INT_MAX则输出0。但这道题中因为不能使用long所以得使用别的方法。因为在每次while循环中增加一个溢出的判断条件语句,溢出可能有两种情况:result>INT_MAX或者result>214748364&&x>7;若出现则其结果返回0.
- 因为以上分析都是基于正数,关于负数的处理:若小于0则返回-reverse(-x),这样所有满足条件的x应该都在考虑范围之中了。
- 通过此思想编写程序之后发现当x取INT_MIN无法通过测试。原因在于signed int型负数可以比正数多表示一位,因此完善代码增加
if (x == INT_MIN)
return 0;
最终代码:
class Solution
{
public:
int reverse(int x)
{
int result = 0;
if (x == INT_MIN)
return 0;
if (x < 0)
return -reverse(-x);
while (x > 0)
{
result = result * 10 + x % 10;
if (result > INT_MAX || (result > 214748364 && x > 7))
return 0;
x = x / 10;
}
return result;
}
};