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

 

但愿对你们有所帮助~

相关文章
相关标签/搜索