• leetcode-mid-math-29. Divide Two Integers-NO


    mycode   91.28%

    class Solution(object):
        def divide(self, dividend, divisor):
            """
            :type dividend: int
            :type divisor: int
            :rtype: int
            """
            if divisor == 0:
                return None
            if((dividend^divisor)<0):
                flag = -1
            else:
                flag = 1
            dividend = abs(dividend) if dividend < 0 else dividend
            divisor = abs(divisor) if divisor < 0 else divisor
            MAX = 2147483647
            MIN = -2147483648 
            res = (dividend // divisor)
            if flag == -1:
                return max(MIN,flag*res)
            else:
                return min(MAX,res)

    参考:

    思路:其实时不能用除法运算的,但是我还是用了。。。。

    这道题的要求是在不使用乘法、除法、取模运算的前提下实现两个整数相除。如果溢出,返回MAX_INT。这道题的直接思路是用被除数不断减去除数,直到为0。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。可以采用位运算进行优化,即模拟计算机上的除法运算。将整数转化成二进制形式,即num = a0*2^0 + a1*2^1 + a2*2^2 + ... + an*2^n。基于以上这个公式以及左移一位相当于乘以2,可以先让除数左移直到大于被除数之前得到一个最大的基数。然后每次用被除数去减去这个基数,同时结果增加2^k。接下来继续重新左移除数左移迭代,直到被除数不大于除数为止。因为这个方法的迭代次数是按2的幂直到结束,所以时间复杂度为O(logn)。值得注意的地方,主要就是处理符号和溢出问题。对于溢出问题,可以先采用long long进行计算,也可以在移位前判断移位后是否溢出。

    #时间复杂度:O(logn)
    #空间复杂度:O(1)

    def divide(dividend, divisor):
            """
            :type dividend: int
            :type divisor: int
            :rtype: int
            """
            positive = (dividend < 0) is (divisor < 0)
            dividend, divisor = abs(dividend), abs(divisor)
            res = 0
            while dividend >= divisor:
                temp, i = divisor, 1
                print(dividend,divisor,temp,i,res)
                while dividend >= temp:
                    dividend -= temp
                    res += i
                    i <<= 1
                    temp <<= 1
                    print('..',dividend,divisor,temp,i,res)
            if not positive:
                res = -res
            return min(max(-2147483648, res), 2147483647)       

     下面这个更好理解些

    class Solution(object):
        def divide(self, dividend, divisor):
            """
            :type dividend: int
            :type divisor: int
            :rtype: int
            """
            ispositive = True
            if dividend > 0 and divisor < 0:
                ispositive = False
            if dividend < 0 and divisor > 0:
                ispositive = False
            dividend = abs(dividend);divisor = abs(divisor)
            if dividend < divisor:
                return 0
            tmp = divisor
            ans = 1
            while dividend >= tmp:
                tmp <<= 1
                if tmp > dividend:
                    break
                ans <<= 1
            tmp >>= 1
            nans = ans + self.divide(dividend - tmp,divisor)
            if ispositive:
                if ans > 2147483647:
                    return 2147483647
                return nans
            if ans >= 2147483648:
                return -2147483648
            return 0 - nans
                    
    
    左移
  • 相关阅读:
    用jQuery实现的简单柱状统计图
    转:Mac下配置eclipse的pydev
    准备做些东西
    UIImageJPEGRepresentation 和 UIImagePNGRepresentation
    UITableView,UITableViewCell,UIPickerView,UISearchBar
    UITableViewCell的显示格式
    js 数据类型检测
    data-xxx 属性的作用是什么
    TCP连接篇
    DNS篇
  • 原文地址:https://www.cnblogs.com/rosyYY/p/10983050.html
Copyright © 2020-2023  润新知