• 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采用的是向下(数轴负方向)取整。而本题定义的应当是向零取整。

  • 相关阅读:
    老李分享:qtp自动化测试框架赏析-关键字自动化测试框架
    QTP自动化测试培训:描述编程之WebElement
    测试开发Python培训:自动发布新浪微博-技术篇
    老李分享:开发python的unittest结果输出样式
    布隆过滤器
    缓存击穿、缓存穿透、缓存雪崩
    JVM锁优化
    Java 异常体系
    常用的SQL调优
    Mysql 索引
  • 原文地址:https://www.cnblogs.com/acetseng/p/4694624.html
Copyright © 2020-2023  润新知