剑指 Offer II 001. 整数除法

本文介绍了两种解决整数除法的算法:快速乘法模板和2倍除法模板。快速乘法模板利用二进制分解和位移操作进行乘法计算,再通过二分搜索找到除法结果。2倍除法模板则通过不断减法和位移优化了计算过程。这两种方法都适用于LeetCode的整数除法问题,提高了计算效率。

题目

输入:a = 7, b = -3
输出:-2
解释:7/-3 = truncate(-2.33333…) = -2

解法

1

  • 快速乘法模板
    • 把乘数 分解成二进制数,然后 通过移位确定 某二进制位是否为1。然后累计2^n次方
    • 用绝对值判断,同或确定flag
  • 二分搜索模板[如有需要,搜索栏搜索二分]
    • l = mid的话,mid = l+r+1 >>1。同理r = mid的话,就mid = l+r>>1
class Solution:
    def divide(self, a: int, b: int) -> int:
        def fastMul(x, y): # x*y
            ans = 0
            while y:
                if (y & 1):
                    ans += x
                y >>= 1
                x <<=1
            return ans 

        if a == 0:
            return 0
            
        flag = not ( a > 0) ^ (b > 0)
		
		# 二分模版
        l, r = 0, abs(a)
        while l < r:
            mid =  (l + r + 1) >> 1
            if fastMul(mid, abs(b)) <= abs(a):
                l = mid 
            else:
                r = mid - 1
        res = l if flag else -l 
        return  2**31 - 1 if res > 2**31-1 or res < -2**31 else int(res)

2倍除

这个解法比上面的快

class Solution:
    def divide(self, a: int, b: int) -> int:
        ret = 0
        flag = (a>0) & (b>0)
        a, b = abs(a), abs(b)

        def calc(x, y):
            n = 1
            while x > y << 1:
                y <<= 1
                n <<= 1
            return n, y

        while a >= b:
            cnt, val = calc(a, b)
            ret += cnt
            a -= val
        ret = -ret if flag else ret
        return ret - 1 if ret >= 2 ** 31 else ret

作者:qingfengpython
链接:https://leetcode-cn.com/problems/xoh6Oh/solution/shua-chuan-jian-zhi-offer-day01-zheng-sh-8u0s/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

万物琴弦光锥之外

给个0.1,恭喜老板发财

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

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

打赏作者

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

抵扣说明:

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

余额充值