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

  • 相关阅读:
    HDFS datanode源码分析
    hive udaf开发入门和运行过程详解
    hive原生和复合类型的数据加载和使用
    tomcat部署web应用(转)
    HDFS namenode源码分析
    HDFS dfsclient写文件过程 源码分析
    hive中UDTF编写和使用(转)
    HDFS dfsclient读文件过程 源码分析
    MapReduce源码分析总结(转)
    DataRabbit 轻量的数据访问框架(09) -- IDataSchemaAccesser
  • 原文地址:https://www.cnblogs.com/acetseng/p/4694624.html
Copyright © 2011-2022 走看看