leetcode —— 29. 兩數相除

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。

返回被除數 dividend 除以除數 divisor 得到的商。

整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = truncate(3.33333…) = truncate(3) = 3

示例 2:

輸入: dividend = 7, divisor = -3
輸出: -2
解釋: 7/-3 = truncate(-2.33333…) = -2

提示:

  • 被除數和除數均爲 32 位有符號整數。
  • 除數不爲 0。
  • 假設我們的環境只能存儲 32 位有符號整數,其數值範圍是 [231,2311][−2^{31}, 2^{31} − 1]。本題中,如果除法結果溢出,則返回 23112^{31} − 1

來源:力扣(LeetCode)
鏈接:https://leetcode-cn.com/problems/divide-two-integers
著作權歸領釦網絡所有。商業轉載請聯繫官方授權,非商業轉載請註明出處。
————————————————
解題思路:

  • 這裏需要考慮除法溢出問題,但是除法溢出主要在分母爲1或者分母爲-1的情況,因此在代碼中單獨考慮溢出情況(單獨分析分母爲1或者-1時發生溢出怎麼處理);
  • 通過累加分母直到達到分子會發生超時,因此通過二分遞歸的方法解決該問題。例如分母爲3,分子爲20,首先20比3大,因此結果至少爲1;將3擴大一倍得到6,則結果也擴大一倍,結果爲2;將6擴大一倍得到12,結果也擴大一倍,結果爲4;將12擴大一倍得到24,這時候大於20,所以將20分爲12+8,結果爲4+8/3,對於8可以重新執行上面的操作,這部分可以使用遞歸解決;
  • 整體的Python代碼如下:
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        
        def div(dividend,divisor):  # 遞歸執行處罰操作
            if dividend < divisor:
                return 0
            count = 1
            temp = divisor
            while temp + temp <= dividend:
                count = count << 1
                temp = temp << 1
            return div(dividend - temp,divisor) + count
        
        INT_MAX = (1<<31) -1  # 32整型的最大值
        INT_MIN = 0 - (1<<31)  # 32位整型的最小值
        if dividend == 0:  # 分子爲零
            return 0
        if divisor == 1:  # 分母爲1,考慮溢出
            return dividend
        if divisor == -1:  # 分母爲-1,考慮溢出
            if dividend > INT_MIN:
                return 0-dividend
            else:
                return INT_MAX
        if (dividend > 0 and divisor > 0) or  (dividend < 0 and divisor < 0):  # 考慮分子分母是否異號
            flag = 1
        else:
            flag = -1
        dividend = abs(dividend)  # 取絕對值,簡化運算
        divisor = abs(divisor)
        ans = div(dividend,divisor)
        
        return ans if flag > 0 else 0-ans
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章