zoukankan      html  css  js  c++  java
  • python LeetCode 两数相除

    近一个月一直在写业务,空闲时间刷刷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

    希望对大家有所帮助~

  • 相关阅读:
    iOS 开发中的坑与相关技巧
    SDK 封装的相关看法
    线程问题---在iPad上会崩溃,在iPhone上不会崩溃
    添加新手引导页需要注意的几个小点
    iOS 七牛云上传并获取图片----【客户端】
    iOS 线程相关-----绝对de干货
    Vue.js 基础示例
    lib-flexible 结合 WKWebView 的样式错乱解决方法
    基于CommentCoreLibrary简单的弹幕实现
    页面上动态编译及执行java代码
  • 原文地址:https://www.cnblogs.com/baiyb/p/9502453.html
Copyright © 2011-2022 走看看