LCR 001

题目:[LCR 001](https://leetcode.cn/problems/powx-n/solutions/238559/powx-n-by-leetcode-solution/)


解法一:快速除 + 位运算

该解法利用减法实现除法,每次尝试使用a减去减数的2倍(位运算),若能够减去,则b再翻倍,计算能够减去几次,减不下时,再对余数执行相同的操作,能够减去的次数就是答案。

例如:取a=23,b=2,b的变化如下:2->4->8->16,次数count的变化如下1->2->4->8,最后a-b=23-16=7。再对7再执行一次上述过程,b:2->4,count:1->2,a-b=3。然后对3再执行一次,b:2,count:1,a-b=1,1已经小于原b=2,可以结束了,最后计数一下每轮的count是多少8+2+1=11,就是我们要的答案啦!

class Solution {
    public int divide(int a, int b) {
        if (a == Integer.MIN_VALUE) {
            if (b == 1) {
                return Integer.MIN_VALUE;
            } else if (b == -1) {
                return Integer.MAX_VALUE;
            }
        }
        if (b == Integer.MIN_VALUE) {
            if (a == Integer.MIN_VALUE) {
                return 1;
            } else {
                return 0;
            }
        }

        boolean flag = false;
        if (a == 0) {
            return 0;
        }
        //flag取反,而不是设置为true
        if (a > 0) {
            a = -a;
            flag = !flag;
        }
        if (b > 0) {
            b = -b;
            flag = !flag;
        }
        if (a > b) { //此时a和b都为负数,注意判断
            return 0;
        }

        int res = quickDivide(a, b);
        return flag ? -res : res;
    }
        public int quickDivide(int a, int b) {
        int res = 0;
        while (a <= b) {
            int temp = b;
            int count = 1;
            //考虑翻倍是否会越界
            while (temp >= Integer.MIN_VALUE >> 1 && a <= temp << 1) {
                temp <<= 1;
                count <<= 1;
            }
            a -= temp;
            res += count;
        }
        return res;
    }

}

注意点

  1. 题目中要求只能使用整型,所以需要考虑越界问题,每当变量取反时,都要考虑该变量是否为-231,否则会出现越界问题
  2. 再对b翻倍时,也需要考虑翻倍后的b是否会越界
  3. 当被除数或除数为正数时,flag应该取反,而不是设置为true

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值