python LeetCode 兩數相除

熔遁丶螺旋手裡劍發表於2018-08-19

近一個月一直在寫業務,空閒時間刷刷leetcode,刷題過程中遇到了一道比較有意思的題目,和大家分享。

 

題目描述:

給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。返回被除數 dividend 除以除數 divisor 得到的商。

示例 1:

輸入: dividend = 10, divisor = 3
輸出: 3

示例 2:

輸入: dividend = 7, divisor = -3
輸出: -2

說明:

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

 

第一反應是這道題還是挺簡單的,用減法實現除法不就好了,python刷題實現甚至可以直接使用range()來實現除法,需要注意的點如下:

1.提前判斷結果的正負號

2.結果在[-2**31,2**31-1]中,要判斷結果是否移除

3.使用range()來計算除法時,一旦除法可以整除我們要對結果+1,因為len(range(3,7,3))的結果是2,len(range(3,9,3))的結果也是2

 

程式碼如下:

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        below = 1
        if dividend < 0 < divisor or divisor < 0 < dividend:
            below = -1

        dividend,  divisor = abs(dividend),  abs(divisor)
        if dividend < divisor:
            return 0
        elif divisor == 1:
            result = dividend * below
            if result >= 2**31-1:
                return 2**31-1
            return result


        result = len(range(divisor, dividend, divisor))
        if (result+1) * divisor == dividend:
            result += 1 
        return result * below

自己寫了好多case來測試都是沒問題的,程式碼提交到leetcode,悲劇了。。。記憶體錯誤,看來是記憶體超了。問題出在核心語句len(range(divisor, dividend, divisor))上,怎麼既能保證目前程式碼的簡潔性又能降低記憶體使用呢。我解決辦法是使用xrange代替range,簡單的說range返回的物件是個list,會開闢一個很大的空間,而xrange不同,返回的是生成器,所以對記憶體的使用得到了直接的優化。重新提交,果然通過了。

 

最終程式碼如下:

class Solution(object):
    def divide(self, dividend, divisor):
        """
        :type dividend: int
        :type divisor: int
        :rtype: int
        """
        below = 1
        if dividend < 0 < divisor or divisor < 0 < dividend:
            below = -1

        dividend,  divisor = abs(dividend),  abs(divisor)
        if dividend < divisor:
            return 0
        elif divisor == 1:
            result = dividend * below
            if result >= 2**31-1:
                return 2**31-1
            return result


        result = len(xrange(divisor, dividend, divisor))
        if (result+1) * divisor == dividend:
            result += 1 
        return result * below

 

希望對大家有所幫助~

相關文章