查看: 1439| 回复: 4
跳转到指定楼层
上一主题 下一主题
收起左侧

[Leetcode] 想问下leetcode 29一个神奇的地方

🔗
ytoa | 只看该作者 |倒序浏览
全局:

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

您需要 登录 才可以下载或查看附件。没有帐号?注册账号

x
本帖最后由 ytoa 于 2020-6-14 07:57 编辑

class Solution {
    public int divide(int dividend, int divisor) {
        if(divisor == 1) return dividend;
     if(dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; //overflow

     boolean isNeg = (dividend > 0) ^ (divisor > 0);
     int res = 0;

     dividend = Math.abs(dividend);
     divisor = Math.abs(divisor);

     while(dividend - divisor >= 0) {
      int temp = divisor;
      int mul = 1;
      while(dividend - (temp << 1) >= 0) {
       temp <<= 1;
       mul <<= 1;
      }
      dividend -= temp;
      res += mul;
     }
     return isNeg ? -res : res;      
    }
}


在跑testcase : dividend = 2147483647  , divisor = 2, 第二个while循环换成while(dividend >= (temp << 1))会超时,理论上不是一样的吗,一直没想通,是overflow的问题吗,求指教

上一篇:先写最优解还是次优解,然后慢慢 follow up?
下一篇:举几个例子,具体说一下面试的时候最优解和次优解的取舍。
🔗
jyyzzj 2020-6-14 08:19:35 来自APP | 只看该作者
全局:
2^31=147483648刚好比那个数大1,那这肯定溢出了啊,第一种写法可以是因为除了*2溢出,-法也溢出了,-负数就是加,,,后面不行是因为大于等于右边是个负数啊
回复

使用道具 举报

🔗
 楼主| ytoa 2020-6-14 08:28:32 | 只看该作者
全局:
jyyzzj 发表于 2020-6-14 08:19
2^31=147483648刚好比那个数大1,那这肯定溢出了啊,第一种写法可以是因为除了*2溢出,-法也溢出了,-负数 ...

明白了,2 << 31得到的是-2147483648,所以死循环了,非常感谢🙏
回复

使用道具 举报

全局:
跟overflow有关系。因为dividend是0111,1111,...,1111。首位是符号位。2的二进制表示是10,不停左移,会得到1000,0000,...,0000也就是-2147483648,这个值你和第一个数比较的话,第一个数更大,通过了while的判断。而且之后temp左移会不停得到0,所以就死循环了。但是你用第一个数减第二个数,此时溢出,二进制表示会得到1111,1111,...,1111也就是-1.这时候是小于0的,第二个while就终止了
回复

使用道具 举报

🔗
 楼主| ytoa 2020-6-14 08:39:19 | 只看该作者
全局:
不知道小帅 发表于 2020-6-14 08:29
跟overflow有关系。因为dividend是0111,1111,...,1111。首位是符号位。2的二进制表示是10,不停左移,会得 ...

👍
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册账号
隐私提醒:
  • ☑ 禁止发布广告,拉群,贴个人联系方式:找人请去🔗同学同事飞友,拉群请去🔗拉群结伴,广告请去🔗跳蚤市场,和 🔗租房广告|找室友
  • ☑ 论坛内容在发帖 30 分钟内可以编辑,过后则不能删帖。为防止被骚扰甚至人肉,不要公开留微信等联系方式,如有需求请以论坛私信方式发送。
  • ☑ 干货版块可免费使用 🔗超级匿名:面经(美国面经、中国面经、数科面经、PM面经),抖包袱(美国、中国)和录取汇报、定位选校版
  • ☑ 查阅全站 🔗各种匿名方法

本版积分规则

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