一、题目:
给你一个 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
二、思路:
对于整数的反转来说,只需要循环取出最后一位数字,并且每一次都对原来的数字和10取整,直到原来的数字为0跳出循环。对于取出的数字只需要将前一次的乘以10加上这次就完成了翻转。
比如:
12345 取出最后一位数为5 // 0*10+5=5 // 12345/10=1234
1234 取出最后一位数为4 // 5*10+4=54 // 1234/10=123
123 取出最后一位数为3 // 54*10+3=543 // 123/10=12
12 取出最后一位数为2 // 543*10+2=5432 // 12/10=1
1 取出最后一位数为1 // 5432*10+1=54321 // 1/10=0
然而问题的关键在于题目所说的翻转后的溢出问题。32位的整型的最大值位2147483647,但是如果以这个数为判断边界,当倒数第二次翻转后的数字大于214748364后再乘以10就会溢出int的最大数导致代码崩溃。所以我们需要以214748364为判断边界。
只要数字小于214748364,就不会出现溢出问题。但是当数字等于214748364就还需要考虑一种情况。由于214748364乘以10还需要加上最后一个数字,当最后一次提取尾数的值大于7就会出现溢出问题,只要最后一次尾数的值小于7就不会出现溢出。
三、代码:
class Solution {
public:
int reverse(int x)
{
int result=0;
int ret=0;
while(x != 0)
{
ret = x % 10;
if(result>214748364 || (result == 214748364 && ret>7))
{
return 0;
}
if(result < -214748364 || (result == -214748364 && ret < -8))
{
return 0;
}
result = result*10 + ret;
x /= 10;
}
return result;
}
};