python LeetCode 兩數相除

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

 

題目描述:ide

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

示例 1:優化

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

示例 2:spa

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

說明:code

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

 

第一反應是這道題仍是挺簡單的,用減法實現除法不就行了,python刷題實現甚至能夠直接使用range()來實現除法,須要注意的點以下:對象

1.提早判斷結果的正負號blog

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

3.使用range()來計算除法時,一旦除法能夠整除咱們要對結果+1,由於len(range(3,7,3))的結果是2,len(range(3,9,3))的結果也是2leetcode

 

代碼以下:

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

 

但願對你們有所幫助~

相關文章
相關標籤/搜索