leetcode做题笔记29

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

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

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

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231,  231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

思路一:直接将除数不断相加直到逼近被除数,即将除法转换为加法

int divide(int dividend, int divisor){
    int ans = 0;
    int sign = 1;
    if ((dividend ^ divisor) < 0) { 
        sign = -1;
    }
    if (divisor == INT_MIN) { 
        if (dividend == INT_MIN) {
            return 1;
        } else {
            return 0;
        }
    }
    if (dividend == INT_MIN) { 
        if (divisor == -1) {
            return INT_MAX;
        } else if (divisor == 1) {
            return INT_MIN;
        }
        dividend += abs(divisor); 
        ans++;
    } 
    int a = abs(dividend);
    int b = abs(divisor);
    while (a >= b) {
        int c = 1;
        int s = b;
        while (s < (a >> 1)) { 
            s += s;
            c += c;
        }
        ans += c;
        a -= s;
    }
    return (sign == -1) ? -ans : ans;
}

对于除数可想到变成减法,减法又可以转换为加法,所以直接将除数相加直到逼近被除数即可,实际编写代码的过程中需考虑负数的问题,此处使用sign来表示结果是否为负数,当被除数和除数一个为负数时,sign=-1,同时需考虑边界问题,当除数和被除数大于intmax或小于intmin时要返回intmax或intmin

收获:对除的运算算法有了自己的理解,可以将除数转换为加减问题来进行运算

你可能感兴趣的:(leetcode,笔记,算法)