zoukankan      html  css  js  c++  java
  • LeetCode#29 Divide Two Integers

    Problem Definition:

    Divide two integers without using multiplication, division and mod operator.

    If it is overflow, return MAX_INT.

    Solution:就是要用加减和位操作之类的运算,来实现除法咯。

    6/3=2的意思是,6里面包含了2个3。因为我们要做的,就是算出被除数dividend中包含了几个除数divisor。

    最直接的想法:不断从dividend里减去divisor,直到dividend小于了divisor,用一个计数变量来统计一共完成了多少次减操作,得到的就是商。

    存在的问题:

    1)如果除数相对于被除数来说很小,就要进行好多次以上这种运算,很耗时。比如被除数是2147483647,而除数是1...;

    2)要考虑符号问题,比如 -3 / 2,并不能直接使用上面的规则;

    3)要处理overflow.

    那么来解决上面的问题 one by one。

    1)借用二分查找的思想,不断扩大(翻倍)divisor,这样能使得减的次数减少很多很多。翻倍可以靠左移操作来实现。注意计数变量增大的跨度也应该跟着翻倍

    2)先确定符号,然后用两数的绝对值继续操作。最后再还原符号。

    3)限定边界

    代码:

     1     # @param {integer} dividend
     2     # @param {integer} divisor
     3     # @return {integer}
     4     def divide(self, dividend, divisor):
     5         pz=(dividend<0)==(divisor<0)
     6         dividend, divisor=abs(dividend), abs(divisor)
     7         result=0
     8     
     9         while dividend>=divisor:
    10             subDvz, cnt=divisor, 1
    11             while dividend>=subDvz:
    12                 dividend-=subDvz
    13                 result+=cnt
    14                 subDvz<<=1
    15                 cnt<<=1
    16         if not pz:  #negative
    17             result=-result
    18         return min(max(-2147483648, result), 2147483647)

    注:以上代码通过了OJ,但是其对除法操作的定义似乎跟Python不一致。用Python算-3/2,结果是-2,而以上代码会返回-1。Python采用的是向下(数轴负方向)取整。而本题定义的应当是向零取整。

  • 相关阅读:
    CSS3 渐变 透明 圆角
    使用JSON作为函数的参数(转载)
    如何让输入的单词首字母大写
    mysql 修改表/字段 增加/删除表索引
    Jquery Mobile 客户端验证
    如何写出漂亮的js代码(转载)
    GoogleMap添加一个Marker
    Log4j的使用【转载】
    Google Map 自定义infowindow
    MYSQL重装出现could not start the service mysql error:0处理(已验证可以使用)
  • 原文地址:https://www.cnblogs.com/acetseng/p/4694624.html
Copyright © 2011-2022 走看看