一亩三分地论坛

 找回密码
 获取更多干货,去instant注册!

扫码关注一亩三分地公众号
查看: 2035|回复: 13
收起左侧

[Leetcode] Reverse Integer 溢出问题

[复制链接] |试试Instant~ |关注本帖
zyy6799 发表于 2015-6-4 03:45:14 | 显示全部楼层 |阅读模式

注册一亩三分地论坛,查看更多干货!

您需要 登录 才可以下载或查看,没有帐号?获取更多干货,去instant注册!

x
关于溢出的问题,已知没弄懂呀

class Solution {
public:
    int reverse(int x) {



        double s=0;
        int flag=1;

        if(x==0) return 0;

        if(x<0)
        {
            flag=-1;
            x=x*(-1);
        }

        while(x>0){
            s = s * 10 + x % 10;
            x=x/10;
        }
        s=s*flag;
        return (s > INT_MAX || s < INT_MIN? 0 : s);

    }
};


为什么红色标注部分一定要设置为double? int 不行么?

评分

1

查看全部评分

Ziyan 发表于 2015-6-4 05:22:06 | 显示全部楼层
这种解法,如果s设为int的话, 下面while循环里 s = s * 10 + x % 10; s每次都乘以10,可能会导致整数溢出~这题我是这么写的,while循环里会先判断是否会导致溢出,如果会的话直接就返回0了,这样就不用设成double~
  1. public class Solution {
  2.     public int reverse(int x) {
  3.         if (x == 0) return 0;
  4.         int res = 0;
  5.         int sign = 1;
  6.         if (x < 0) {
  7.             sign = -1;
  8.             x = -1 * x;
  9.         }
  10.         while (x != 0) {
  11.             if (res > (Integer.MAX_VALUE - x % 10) / 10) {
  12.                 return 0;
  13.             }
  14.             res = res * 10 + x % 10;
  15.             x = x / 10;
  16.         }
  17.         return res * sign;
  18.     }
  19. }
复制代码
回复 支持 1 反对 0

使用道具 举报

oio14644 发表于 2015-6-8 02:31:17 | 显示全部楼层

long

用 long 也行吧
回复 支持 反对

使用道具 举报

 楼主| zyy6799 发表于 2015-6-8 02:34:51 | 显示全部楼层

可以用long long. 但是long和int 都是4 byte。 应该会出现溢出问题
回复 支持 反对

使用道具 举报

caffery24 发表于 2015-6-8 13:23:47 | 显示全部楼层
楼主我也遇到过这种情况,因为如果不用double或者Long,用int的话,你的转换结果一旦超出了INTEGER.MAX_VALUE,下一次转换就会有问题,永远会小于max_val
回复 支持 反对

使用道具 举报

tailofjune 发表于 2015-6-8 18:29:51 | 显示全部楼层
解决这种考虑溢出的问题时用更长的数据类型感觉都属于作弊...
回复 支持 反对

使用道具 举报

 楼主| zyy6799 发表于 2015-6-9 09:50:19 | 显示全部楼层
tailofjune 发表于 2015-6-8 18:29
解决这种考虑溢出的问题时用更长的数据类型感觉都属于作弊...

但是我当时也在while循环中设置了判断,但是还是不行。。不知道为什么。
回复 支持 反对

使用道具 举报

 楼主| zyy6799 发表于 2015-6-9 09:54:07 | 显示全部楼层
caffery24 发表于 2015-6-8 13:23
楼主我也遇到过这种情况,因为如果不用double或者Long,用int的话,你的转换结果一旦超出了INTEGER.MAX_VAL ...

long 不是也和int一样是32bits 么? 难道不是一样的么?
回复 支持 反对

使用道具 举报

caffery24 发表于 2015-6-9 10:15:58 | 显示全部楼层
zyy6799 发表于 2015-6-9 09:50
但是我当时也在while循环中设置了判断,但是还是不行。。不知道为什么。

不行,如果是int的话,它会自己把自己限制在Int的范围内。比如说你这次计算结果超过了32bit,但是32bit以外的它会删除,只留下32bit,所以结果永远是小于MAX_VALUE,只有别的,把超过的数值保存下来比较,才有用
回复 支持 反对

使用道具 举报

 楼主| zyy6799 发表于 2015-6-9 10:18:13 | 显示全部楼层
Ziyan 发表于 2015-6-4 05:22
这种解法,如果s设为int的话, 下面while循环里 s = s * 10 + x % 10; s每次都乘以10,可能会导致整数溢出~ ...

对的,学习了!!!
回复 支持 反对

使用道具 举报

 楼主| zyy6799 发表于 2015-6-9 10:19:36 | 显示全部楼层
caffery24 发表于 2015-6-9 10:15
不行,如果是int的话,它会自己把自己限制在Int的范围内。比如说你这次计算结果超过了32bit,但是32bit以 ...

恩恩,大神,还有个问题~ 我上网查了一下,long和int的范围不是一样都是是32bits 么?
回复 支持 反对

使用道具 举报

caffery24 发表于 2015-6-12 15:47:27 | 显示全部楼层
zyy6799 发表于 2015-6-9 10:19
恩恩,大神,还有个问题~ 我上网查了一下,long和int的范围不是一样都是是32bits 么?

。。。我不是大神啊。。。我也卡住了好久。。java里long是64bits吧?
回复 支持 反对

使用道具 举报

2006reload 发表于 2015-6-12 16:47:13 | 显示全部楼层
public class Solution {
    public int reverse(int x) {
        int result = 0;
        while(x != 0){
            int d = x%10;
            if(Math.abs(result) > Integer.MAX_VALUE/10 )return 0;
            result = result*10 + d;
            x /= 10;
        }
        return result;
    }
}
回复 支持 反对

使用道具 举报

自己人 发表于 2016-7-28 10:15:31 | 显示全部楼层
楼主,我也遇到同样的问题,long和int不都是32bit吗,为什么long可以,int不行
回复 支持 反对

使用道具 举报

本版积分规则

请点这里访问我们的新网站:一亩三分地Instant.

Instant搜索更强大,不扣积分,内容组织的更好更整洁!目前仍在beta版本,努力完善中!反馈请点这里

关闭

一亩三分地推荐上一条 /5 下一条

手机版|小黑屋|一亩三分地论坛声明 ( 沪ICP备11015994号 )

custom counter

GMT+8, 2016-12-8 06:52

Powered by Discuz! X3

© 2001-2013 Comsenz Inc. Design By HUXTeam

快速回复 返回顶部 返回列表