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
                

左移
原文地址:https://www.cnblogs.com/rosyYY/p/10983050.html