Leetcode做题日记:29. 两数相除(PYTHON)

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:

输入: dividend = 10, divisor = 3
输出: 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2

说明:

被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。
本题中,如果除法结果溢出,则返回 231 − 1。

我最后提交的答案,44ms,击败27%
思路就是位运算,创新点是我把每一次的i都加入一个列表,其中每一个i都是2的幂,所以我最后把列表中的i都换成幂,得到答案,我举一个例子:23/4,第一轮:4x2^ (2)=16<23,k=[2],dd=23-16=7,第二轮:4x2 ^(0)=4<7,k=[2,0] i=0了迭代完毕,计算得到ans=5

#判断fh(符号)
	if dividend>0 and divisor<0 or dividend<0 and divisor>0:
            fh=-1
        elif dividend<0 and divisor<0 or dividend>0 and divisor>0:
            fh=+1  
        else:
            fh=+1
        dd=abs(dividend) #取绝对值方便运算
        dr=abs(divisor)
        i=0
        k=[] 
        for i in range(32,-1,-1): #让i从32到0
            if dr<<i <= dd: #只有当dr*2^i刚好小于dd的时候
                            #这个i就是最大的那个
                dd=dd-(dr<<i) #从第二轮开始,dd变成了dividend与
                              #dr*2^i的差值,继续找这个差值中有多少个dr

                k.append(i) #依次加入迭代中成立的i,
        ans=0
        for i in k: #将k中的i浮现出来,就是我们的答案了
            ans=ans+2**i
        if fh*ans < -2**31 or fh*ans > (2**31) -1:
            return 2**31 -1
        else:
            return fh*ans   
第一次的代码,希望做简单减法,来找到答案,小值都还好,但是遇到100000/1的时候,要执行100000次,超时妥妥的
	dd=dividend
        dr=divisor
        if dd>0 and dr<0 or dd<0 and dr>0:
            fh=-1
        elif dd<0 and dr<0 or dd>0 and dr>0:
            fh=+1  
        else:
            fh=+1
        dd1=abs(dd)
        dr1=abs(dr)
        i=0
        c=dd1-dr1
        d=0
        while True:    
            if c==0: #比如3/3,c=0,i=1
                i=i+1
                break
            if c<0:
              break
            i=i+1
            c=c-dr1    
        d=fh*i
        if d<-2**31:
            return 2**31-1
        if d>2**31-1:
            return 2**31-1
        return d          

猜你喜欢

转载自blog.csdn.net/weixin_44033136/article/details/85343985
今日推荐