🚩传送门:牛客题目

题目

给你一个 32 位的有符号整数 [NC]57. 反转数字 - 图1 ,返回将[NC]57. 反转数字 - 图2 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [NC]57. 反转数字 - 图3 ,就返回 [NC]57. 反转数字 - 图4

假设:环境不允许存储 64 位整数(有符号或无符号)

示例 1:

输入:x = 123 输出:321

示例 2:

输入:x = -123 输出:-321

示例 3:

输入:x = 120 输出:21

示例 4:

输入:x = 0 输出:0

解题思路:数学

溢出条件有两个:

  1. 大于整数最大值 [NC]57. 反转数字 - 图5+2147483647
    • 当出现 [NC]57. 反转数字 - 图6 且 还有 [NC]57. 反转数字 - 图7 需要添加时,则一定溢出
    • 当出现 [NC]57. 反转数字 - 图8[NC]57. 反转数字 - 图9 时,则一定溢出
  2. 小于整数最小值 [NC]57. 反转数字 - 图10-2147483648
    • 当出现 [NC]57. 反转数字 - 图11 且 还有 [NC]57. 反转数字 - 图12 需要添加时,则一定溢出
    • 当出现 [NC]57. 反转数字 - 图13[NC]57. 反转数字 - 图14 时,则一定溢出

设当前已计算结果为 **res**,下一位取余为 **temp**

复杂度分析

时间复杂度:[NC]57. 反转数字 - 图15,翻转的次数即 [NC]57. 反转数字 - 图16 十进制的位数。

空间复杂度:[NC]57. 反转数字 - 图17,使用常数的空间

我的代码

  1. public int reverse(int x) {
  2. int res = 0;
  3. while(x!=0) {
  4. // 每次取末尾数字
  5. int tmp = x%10;
  6. // 判断是否 大于 最大32位整数
  7. if (res>214748364 || (res==214748364 && tmp>7))
  8. return 0;
  9. // 判断是否 小于 最小32位整数
  10. if (res<-214748364 || (res==-214748364 && tmp<-8))
  11. return 0;
  12. res = res*10 + tmp;
  13. x /= 10;
  14. }
  15. return res;
  16. }