近一個月一直在寫業務,空閑時間刷刷leetcode,刷題過程中遇到了一道比較有意思的題目,和大家分享。 題目描述: 給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算符。返回被除數 dividend 除以除數 divisor 得到的商。 ...
近一個月一直在寫業務,空閑時間刷刷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
希望對大家有所幫助~