[LeetCode-Java]29. Divide Two Integers

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

If it is overflow, return MAX_INT.

解:题目不能用乘除法和取余运算,直接迭代相减又会超时(时间复杂度O(n)),考虑使用移位运算。
比如20/3 , 20 = 3*2^2+3*2^1+2 , 因而20/3 = 2^2+2^1=6.
求解思路:每次将divisor左移位,直到达到小于dividend的最大整数A,此时左移次数为count,即达到an*2^n阶,商大于等于count,然后将dividend-A作为dividend,迭代运算,cout累加到商。
注意:
(1)dividend和divisor的符号。
(2)int的绝对值。int里面有一个特殊的数字:-2147483648,它的绝对值或者相反数 2147483648是超出int的范围的,对于这一情况需要特殊处理。

 public int divide(int dividend, int divisor) {

        if (divisor == 0)  return Integer.MAX_VALUE;

        int result = 0;

       //获取符号位   >>>为无符号右移
        boolean isNegative = (dividend ^ divisor)>>>31 == 1;
        //因为0x80000000取绝对值会int越界
        if(dividend == Integer.MIN_VALUE){
            dividend += Math.abs(divisor);
            if(divisor == -1){
                return Integer.MAX_VALUE;
            }
            result++;
        }

        if (divisor == Integer.MIN_VALUE){
            return result;
        }

        dividend = Math.abs(dividend);
        divisor = Math.abs(divisor);

        while (divisor <= dividend){
            //这里最终的temp大于divident,所以定义为long防止int越界
            long temp = divisor;
            int count;
            for (count = 0;temp <= dividend;count++) {
                temp <<= 1;
            }

            result += (1<<(count-1));
            dividend -=  (divisor<<(count-1));
        }

        if (isNegative) result = -result;

        return result;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值