剑指offer 整数的除法Java

力扣题目链接
遇到代替乘除或者优化乘除,首先考虑位运算
这道题需要注意Integer.MIN_VALUE

直接用减法来替代会超出时间限制

class Solution {
    public int divide(int a, int b) {
        
        if (b == 0)
            return 0;
        if (a == Integer.MIN_VALUE){
            if (b == -1) return Integer.MAX_VALUE;
            if (b == 1) return Integer.MIN_VALUE;
        }
        if (b == Integer.MIN_VALUE){
            if (a == Integer.MIN_VALUE) return 1;
            else return 0;
        }
        int sign = -1;//判断结果正负
        //a,b均设为负数,防止越界
        if (a > 0) {
            sign = -sign;
            a = -a;
        }
        if (b > 0) {
            sign = -sign;
            b = -b;
        }
        int res = 0;
        while (a <= b){
            a -= b;
            ++res;
        }
        if (sign > 0)
            res = -res;
        return res;
    }
}

位运算操作符的优先级大于判断符

class Solution {

     public int divide(int a, int b) {

        //特殊情况,当被除数为Integer.MIN_VALUE,除数为-1时,直接返回Integer.MAX_VALUE
        if (a == Integer.MIN_VALUE && b == -1) {
            return Integer.MAX_VALUE;
        }

        //判断除数和被除数是否同号,同号为true,返回正数,异号反之
        boolean flag = false;
        if ((a<0 && b<0) || (a>0 && b>0)) {
            flag = true;
        }

        //转为绝对值
        long dividend = Math.abs((long) a);
        long divisor = Math.abs((long) b);
        //如果被除数小于除数直接返回零
        if (dividend < divisor) {
            return 0;
        }

        //计算 结果的绝对值
        int result = 0;
        int shift = 31;
        while (dividend >= divisor) {
            //当被除数小于除数乘以2的31次方
            while (dividend < divisor << shift) {
                //除数少乘一个二
                shift--;
            }
            //当被除数为15,除数为2时,跳出里边while循环时,shift为2
            //15 -= 2<<2 ---->7
            //7 -=2<<1 ---->3
            //3 -=2<<0 ---->1
            dividend -= divisor << shift;
            //4+2+1
            result += 1 << shift;
        }

        //返回判断完正负号的答案
        return flag ? result : -result;
    }
}

posted @   蹇爱黄  阅读(44)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?
点击右上角即可分享
微信分享提示