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。

思路:先把网上大神的思路和执行最快的代码看懂。。。。

其实这两代码的思路都是一样的。都是先处理特殊情况,符号位然后再进行移位和减法运算

代码:

class Solution {
    public int divide(int dividend, int divisor) {
        // 相除时溢出处理
        if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) {
            return Integer.MAX_VALUE;
        }

        // 求符号位
        int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;

        // 求绝对值,为防止溢出使用long
        long dvd = Math.abs((long) dividend);
        long dvs = Math.abs((long) divisor);

        // 记录结果
        int result = 0;

        // 被除数大于除数
        while (dvd >= dvs) {
            // 记录除数
            long tmp = dvs;
            // 记录商的大小
            long mul = 1;

            while (dvd >= (tmp << 1)) {
                tmp <<= 1;
                mul <<= 1;
            }

            // 减去最接近dvd的dvs的指数倍的值(值为tmp)
            dvd -= tmp;

            // 修正结果
            result += mul;
        }

        return result * sign;
    }
}

执行最快的代码

思路:(1)利用位运算和减法做除法.将被除数表示为以2 的幂为底的一组基的线性组合。将一个数向左移一位相当于乘以2

            (2)首先对几种特殊情况进行判断。被除数为0,除数为0或者是结果超出最大的范围;接着判断是否为负数用一个标志位表示;然后对被除数和除数分别取绝对值进行位运算和减法运算;最后输出结果时,考虑正负数的标志位。

class Solution {
    public int divide(int dividend, int divisor) {
        if (dividend == 0) return 0;
        if (divisor == 0 || (dividend == Integer.MIN_VALUE && divisor == -1)) return Integer.MAX_VALUE;

        boolean isOpposite = false;
        if ((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0)) {
            isOpposite = true;
        }

        long end = Math.abs((long)dividend);
        long sor = Math.abs((long)divisor);
        int res = 0;
       while (end >= sor) {
           long temp = sor, shift = 1;
           while (end >= (temp << 1)) {
               temp <<= 1;
               shift <<= 1;
           }
           end -= temp;
           res += shift;
       }


        return (isOpposite ? (-res) : res);
    }
}

猜你喜欢

转载自blog.csdn.net/chenxy132/article/details/82767207
今日推荐