【leetcode】【29】Divide Two Integers

144 篇文章 0 订阅

一、问题描述

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

If it is overflow, return MAX_INT.

二、问题分析

对于处理数字问题,有几点需要注意①溢出②正负。

该题溢出的情况只有MIN_INT/-1会溢出,结果的正负与dividend和divisor都有关系。题目又描述了不能采用乘除和取模运算,那么还剩的只有加减和移位操作。而除法可以看做是加减法,为了防止超时,显然不能一个一个的加或者减,因此可以成倍的加减。具体的看代码。时间复杂度O(logn)。

三、Java AC代码

public int divide(int dividend, int divisor) {
        if(dividend==0 || divisor==0) return 0;
        if(dividend==Integer.MIN_VALUE && divisor==-1) return Integer.MAX_VALUE;
        boolean isNeg = (dividend>0 && divisor<0) || (dividend<0 && divisor>0);
        long a = Math.abs((long)dividend);
        long b = Math.abs((long)divisor);
        if(a < b) return 0;
        int count = 0;
        long sum = 0;
        int res = 0;
        while(a>=b){
            sum = b;
            count = 1;
            while(sum+sum<=a){
                sum <<= 1;
                count <<= 1;
            }
            res += count;
            a -= sum;
        }
        return isNeg? -res: res;
    }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值