leetcode-29

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
示例 2:

输入: dividend = 7, divisor = -3
输出: -2
说明:

被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,  231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

这道题在考察什么?我个人感觉是对除的理解和左移的理解。

这个方法实际上就是用逻辑实现左移,但是超出时间限制

class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == 0) {
            return 0;
        }
        if (divisor == 1) {
            return dividend;
        }
        if (divisor == -1) {
            if (dividend > Integer.MIN_VALUE) {
                return -dividend;
            } else {
                return Integer.MAX_VALUE;
            }
        }
        int a = dividend;
        int b = divisor;
        int sign = 1;
        if ((a > 0 && b < 0) || (a < 0 && b > 0)) {
            sign = -1;
        }

        a = a > 0 ? a : -a;
        b = b > 0 ? b : -b;

        int res = div(a, b);
        if (sign > 0) {
            return res > Integer.MAX_VALUE ? Integer.MIN_VALUE : res;
        }
        return -res;
    }
    public static int div(int a, int b) {
        if (a < b) {
            return 0;
        }
        int count = 1;
        int tb = b;

        while ((tb + tb) <= a) {
            count  = count + count;
            tb = tb + tb;
        }
        return count + div(a - tb, b);
    }
}

另一个方案

class Solution {
    public int divide(int dividend, int divisor) {
        boolean sign = (dividend > 0) ^ (divisor > 0);
        int result = 0;
        if(dividend>0) {
            dividend = -dividend;
        }
        if(divisor>0) divisor = -divisor;
        while(dividend <= divisor) {
            int temp_result = -1;
            int temp_divisor = divisor;
            while(dividend <= (temp_divisor << 1)) {
                if(temp_divisor <= (Integer.MIN_VALUE >> 1))break;
                temp_result = temp_result << 1;
                temp_divisor = temp_divisor << 1;
            }
            dividend = dividend - temp_divisor;
            result += temp_result;
        }
        if(!sign) {
            if(result <= Integer.MIN_VALUE) return Integer.MAX_VALUE;
            result = - result;
        }
        return result;
    }
}

end

一个小知识点就是符号是占最高位的。int的最大最小值不要搞混。

猜你喜欢

转载自www.cnblogs.com/CherryTab/p/12158594.html