力扣专题——剑指 Offer II 001. 整数除法

Posted super尚

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣专题——剑指 Offer II 001. 整数除法相关的知识,希望对你有一定的参考价值。

题目:
给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。

注意:
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1

解题思路
除法最简单的思路就是一直减除数,直到减不动为止,减的次数就是商。当然前提要判断被除数和除数的正负,同号不用管,异号的时候要变为同号,并标记结果。
其次更快捷一点的方法是移位操作:
1.每次将除数左移一位,相当于除数乘以2,也就将初始化为1的商左移一位。
2.直到被除数小于等于当前除数的2倍,这样再让被除数减去当前除数。
3.剩下的值继续从初始的除数从第一步开始。
这里同样要判断除数被除数是否同号,来对商进行确定。
还有一点要注意的是如果商的值大于等于2**31,那么ret要减1,这个就很奇怪

代码

class Solution:
    def divide(self, a: int, b: int) -> int:
        ret=0
        flag=False if(a>0 and b>0) or (a<0 and b<0) else True
        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=a-val
        ret=-ret if flag else ret
        return ret-1 if ret>=2**31 else ret

以上是关于力扣专题——剑指 Offer II 001. 整数除法的主要内容,如果未能解决你的问题,请参考以下文章

力扣专题——剑指 Offer II 002. 二进制加法

力扣461,剑指offer59-I,59-II,60,61

力扣1190/6/剑指Offer57-II/58-I/-II

力扣专题——剑指 Offer 22. 链表中倒数第k个节点

LeetCode 剑指 Offer II 115.重建序列:图解 - 拓扑排序

LeetCode 剑指 Offer II 树(上) 专题总结