LeetCode第29题 两数相除

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

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

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例 1:

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

提示:

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

来一种java能过,python太慢超时的方案

45

我们知道乘法的实质是累加,而除法是不是可以当做为累积差,也就是从一个数(被除数)中重复的减去某一个固定的数(除数),但在这个过程中我们需要额外的注意边界问题和符号问题。接下来我们进行分类讨论

1、当两个数都是正数时候,我们可以循环进行以下过程,即当被除数大于除数时候,从被除数中间循环减去除数,直到不满这个条件为止,循环次数即为最终结果

            int res = 0;
            while(dividend>=divisor){
                dividend -= divisor;
                res ++;
            }

2、当被除数为正数,而除数为负数时。我们可以循环进行以下过程,当被除数大于等于0时候,我们让被除数加上除数,直到这个条件不满足为止,最终结果为-循环次数 + 1

            int res = 0;
            while(dividend>=0){
                dividend += divisor;
                res ++;
            }

3、当被除数为负数,而除数为正数时候。我们可以循环进行以下过程,当被除数小于等于0时候,我们让被除数加上除数,直到这个条件不满足为止,最终结果为-循环次数+1

            int res = 0;
            while(dividend<=0){
                dividend += divisor;
                res ++;
            }

 4、当被除数和除数都是负数时候,我们可以循环进行以下过程,当被除数小于0时候,我们让被除数减去除数,直到这个条件不满足为止,最终结果为循环次数-1

            int res = 0;
            while(dividend<0){
                dividend -= divisor;
                res ++;
            }

 代码整合:

class Solution {
 public int divide(int dividend, int divisor) {
        if(dividend==divisor){
            return 1;
        }
        if(divisor==1){
            return dividend;
        }
        if(divisor==-1){
            if(dividend==-2147483648){
                return  2147483647;
            }else {
                return  (~dividend+1);
            }
        }
        if(((dividend>>31)&1)==0&&((divisor>>31)&1)==0){
            int res = 0;
            while(dividend>=divisor){
                dividend -= divisor;
                res ++;
            }
            return res;
        }else if(((dividend>>31)&1)==0&&((divisor>>31)&1)==1){
            int res = 0;
            while(dividend>=0){
                dividend += divisor;
                res ++;
            }
            return -(res - 1);
        }else if(((dividend>>31)&1)==1&&((divisor>>31)&1)==0){
            int res = 0;
            while(dividend<=0){
                dividend += divisor;
                res ++;
            }
            return -(res - 1);
        }else {
            int res = 0;
            while(dividend<0){
                dividend -= divisor;
                res ++;
            }
            return (res - 1);
        }
    }
}

你可能感兴趣的:(随便写点,学习笔记,算法,leetcode)