leetcode 29 Divide Two Integers

Divide Two Integers

 

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

class Solution1:
    # @return an integer
    def divide(self, dividend, divisor):
        if dividend==0:
            return 0
        ans=0
        a1=abs(dividend)
        a2=abs(divisor)
        while a1>=a2:
            ans+=1
            a1-=a2
        if dividend>0 and divisor>0 or dividend<0 and divisor<0:
            return ans
        else:
            return -ans
当divide(-2147483648, -1),超时。


可以让除数每次翻倍,不够减时每次再折半,运算次数就会在log(MAX_INT)*2=62次之内了。

由于不能使用除法,每次翻倍都要记录翻倍前的数字。

class Solution:
    # @return an integer
    def divide(self, dividend, divisor):
        if dividend==0:
            return 0
        ans=0
        a1=abs(dividend)
        a2=[abs(divisor)]
        base=[1]
        p=0
        while a1>=a2[p]:
            ans+=base[p]
            a1-=a2[p]
            a2.append(a2[p]+a2[p])
            base.append(base[p]+base[p])
            p+=1
        while a2[p]>abs(divisor):
            a2.pop()
            p-=1
            while a1>=a2[p]:
                ans+=base[p]
                a1-=a2[p]
        if dividend>0 and divisor>0 or dividend<0 and divisor<0:
            return ans
        else:
            return -ans

为了应对“ If it is overflow, return MAX_INT.”,还需要加上ans与MAX_INT的比较

if dividend>0 and divisor>0 or dividend<0 and divisor<0:
            if ans>2147483647:
                return 2147483647
            else:
                return ans
        else:
            if ans>2147483648:
                return -2147483648
            return -ans









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值