【Leetcode 29】 两数相除

题目描述

在这里插入图片描述
方法一:
题干中说明不能用乘法和除法, 那么我们可以用减法, 被除数最多可以减多少个除数还能保证是非负的即可.换句话说商为被除数减去除数的总次数

class Solution:
    def divide(self, dividend, divisor):
        sig = True if dividend*divisor > 0 else False  # 判断二者相除是正or负
        dividend, divisor= abs(dividend), abs(divisor)  # 将被除数和除数都变成正数
        count = 0  # 用来表示减去了多少个除数,也就是商为多少
        while divisor <= dividend:  # 当被除数小于除数的时候终止循环
            dividend -= divisor
            count += 1
        res = count if sig == True else -count  # 给结果加上符号
        return max(min(res, 2**31-1), -2**31)

方法二:
针对于第一种的缺陷, 我们应该想到让除数成倍的增长, 这样被除数进行的减法操作就会少很多.

class Solution:
    def divide(self, dividend, divisor):
        sig = True if dividend*divisor > 0 else False  # 判断二者相除是正or负
        dividend, divisor= abs(dividend), abs(divisor)  # 将被除数和除数都变成正数
        res = 0                               # 用来表示减去了多少个除数,也就是商为多少
        while divisor <= dividend:              # 当被除数小于除数的时候终止循环
            tmp_divisor, count = divisor, 1     # 倍增除数初始化
            while tmp_divisor <= dividend:      # 当倍增后的除数大于被除数重新,变成最开始的除数
                dividend -= tmp_divisor
                res += count
                count += 1                      # 更新除数扩大的倍数
                tmp_divisor = divisor*count     # 更新除数
        res_value = res if sig == True else -res  # 给结果加上符号
        return max(min(res_value, 2**31-1), -2**31)

方法三:该方法是对方法二的优化, 因为方法二中还是用到了乘法,所以我们可以用移位运算来代替乘法运算, 每次移动一位相当于扩大了两倍, 这个时候大家应该能感觉出来方法三比方法二的计算速度可能会更快一些(因为方法二是除数扩大倍数是1倍1倍的增加, 而方法三中除数扩大的倍数是两倍两倍的增加).

class Solution:
    def divide(self, dividend, divisor):
        sig = True if dividend*divisor > 0 else False   # 判断二者相除是正or负
        dividend, divisor= abs(dividend), abs(divisor)  # 将被除数和除数都变成正数
        res = 0                                         # 用来表示减去了多少个除数(减去除数的次数),也就是商为多少
        while divisor <= dividend:                      # 当被除数小于除数的时候终止循环
            tmp_divisor, count = divisor, 1             # 倍增除数初始化
            while tmp_divisor <= dividend:              # 当倍增后的除数大于被除数重新,变成最开始的除数
                dividend -= tmp_divisor
                res += count                    
                count <<= 1                             # 向左移动一位
                tmp_divisor <<= 1                       # 更新除数(将除数扩大两倍)
        res_value = res if sig == True else -res        # 给结果加上符号
        return max(min(res_value, 2**31-1), -2**31)

方法四:python的作弊法,用//

class Solution:
    def divide(self, dividend, divisor):
        sig = False if dividend * divisor < 0 else True  # 判断二者相除是正or负
        dividend, divisor = abs(dividend), abs(divisor)
        tmp = dividend // divisor
        res_value = tmp if sig == True else -tmp
        return min(max(res_value, -2**31), 2**31 - 1)

方法五:python 5行代码
在这里插入图片描述

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        a, b, r, t = abs(dividend), abs(divisor), 0, 1
        while a >= b or t > 1:
            if a >= b: r += t; a -= b; t += t; b += b
            else: t >>= 1; b >>= 1
        return min((-r, r)[dividend ^ divisor >= 0], (1 << 31) - 1)

参考链接
https://leetcode-cn.com/problems/divide-two-integers/solution/chu-fa-dao-jian-fa-de-zhuan-hua-by-h_n/
https://leetcode-cn.com/problems/divide-two-integers/solution/python-5-xing-by-knifezhu/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bug 挖掘机

支持洋子

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值