每日一题力扣29

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

 

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

错解:超时了。。。

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        cnt=0
        n=1
        if dividend >0 and divisor>0:
            n=1
        elif dividend >0 and divisor<0:
            n=-1
        elif dividend <0 and divisor<0:
            n=1
        elif dividend <0 and divisor>0:
            n=-1
        if -2147483648 < n < 2147483647:
        while abs(dividend)>=abs(divisor):
            dividend=abs(dividend)-abs(divisor)
            cnt+=1
        
        return cnt*n

 

正解

位运算不是很明白

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        sign = (dividend > 0)^(divisor>0)#如果两个条件不同时满足,那就是1,即true
        dividend,divisor = abs(dividend),abs(divisor)
        n = 0 
        while divisor <=  dividend:
            divisor = divisor << 1
            n+=1
        res = 0
        while n>0:
            divisor = divisor>>1
            n-=1
            if dividend>=divisor:
                res += 1<<n
                dividend -= divisor
        if sign:
            res = -res
        m = 1<<31
        if res > m -1:
            return m -1
        elif res <-m:
            return -m
        else:
            return res

 

posted @ 2021-03-12 16:51  小千北同学超爱写代码  阅读(66)  评论(0编辑  收藏  举报