29. Divide Two Integers

【Description】
Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example 1:
Input: dividend = 10, divisor = 3
Output: 3

Example 2:
Input: dividend = 7, divisor = -3
Output: -2

【Idea】
因为不能使用乘除法,所以要从加减的角度去优化
暴力加减我试过,基本超时了。
秃头之际,还是看了大佬们的解法。
主流是 使用左移右移的trick代替乘除,抵消了暴力法的很多蛮力;
另一个很妙的trick是 在每次循环中,设置了一个temp,让dividend每次除以双倍的(prev)temp,又抵消掉了很多多余的遍历。

【Solution】

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        # 这里设的也很巧妙, 同号为TRUE,异号False
        positive = (dividend < 0) is (divisor < 0)    
        dividend, divisor = abs(dividend), abs(divisor)
        res = 0
        while dividend >= divisor:
            temp, i = divisor, 1
            while dividend >= temp:
                dividend -= temp
                res += i
                # 这里的temp 左移*2, 对应i*2 也是为了做temp的记录,可以减少时间复杂度
                i <<= 1
                temp <<= 1
        if not positive:
            res = -res
        return min(max(-2147483648, res), 2147483647)


你可能感兴趣的:(29. Divide Two Integers)