给你一个 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
来源:力扣(LeetCode)
链接:https ://leetcode.cn/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
本题如果不考虑溢出问题,是非常简单的。解决溢出问题有两个思路,第一个思路是通过字符串转换加try catch的方式来解决,第二个思路就是通过数学计算来解决。
由于字符串转换的效率较低且使用较多库函数,所以解题方案不考虑该方法,而是通过数学计算来解决。
通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。
溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE,设当前计算结果为ans,下一位为pop。
从ans * 10 + pop > MAX_VALUE这个溢出条件来看
当出现 ans > MAX_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans == MAX_VALUE / 10 且 pop > 7 时,则一定溢出,7是2 ^ 31 - 1的个位数
从ans * 10 + pop < MIN_VALUE这个溢出条件来看
当出现 ans < MIN_VALUE / 10 且 还有pop需要添加 时,则一定溢出
当出现 ans == MIN_VALUE / 10 且 pop < -8 时,则一定溢出,8是 - 2 ^ 31的个位数
#define _CRT_SECURE_NO_WARNINGS #includeint test(int x) { int y = 0; int z = 0; int max = 2147483647;//int 最大值 int min = -max - 1; //printf("%dn", -max-1); //printf("%dn", max); if (x == 0) { return x; } if (x == min)//由于x负数比正数多一个 可能会造成无法将负数去负 把最后这个负数单列 { return 0; } z = x;//先把最开始的x储存在z中 以方便后续分类讨论 while (x != 0) { if (x < 0)//x小于0的情况 x = -x; //printf("%dn", x); y = y * 10 + x % 10; //printf("%dn", y); x = x / 10; if (x/10 == 0 && x != 0)//检查是否溢出 { if (z > 0) { if (y > max / 10 || ( y == max/10 && x > max % 10)) return 0; } if (z < 0) { if ((-y) < (-max - 1)/10 || ((-y)== (-max - 1) / 10 && (-x)< (-max - 1) % 10)) return 0; } } } if (z < 0) y = -y; return y; } int main() { int x = -2147483647; x = test(x); printf("%d", x); return 0; }



