近一個月一直在寫業務,空閒時間刷刷leetcode,刷題過程當中遇到了一道比較有意思的題目,和你們分享。python
題目描述:ide
給定兩個整數,被除數 dividend
和除數 divisor
。將兩數相除,要求不使用乘法、除法和 mod 運算符。返回被除數 dividend
除以除數 divisor
獲得的商。測試
示例 1:優化
輸入: dividend = 10, divisor = 3
輸出: 3
示例 2:spa
輸入: dividend = 7, divisor = -3
輸出: -2
說明:code
第一反應是這道題仍是挺簡單的,用減法實現除法不就行了,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
但願對你們有所幫助~