题目:力扣https://leetcode-cn.com/problems/divide-two-integers/
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
if(divisor == Integer.MIN_VALUE && dividend == Integer.MIN_VALUE)
return 1;
if(divisor == Integer.MIN_VALUE)
return 0;
int count = 0;
int op = dividend < 0 ? -1 : 1;
op = divisor < 0 ? -op : op;
dividend = -Math.abs(dividend);
divisor = -Math.abs(divisor);
while(dividend<=divisor){
dividend = dividend-divisor;
count++;
}
return count*op;
}
}
思路:小学的时候初学除法的时候老师都用减法来跟我们解释,这题我处理的方法也是将除法用减法代替。逻辑很简单,代码也好写(除了限制边界条件),就是效率太低。很容易会出现“超出时间限制”的情况。
1.边界条件与特殊情况的处理。若被除数dividend为0,则最终结果直接为0;若除数与被除数同等与int类型的最小值时,两数相除结果为1;若除数等于int类型的最小值时,任何int类型的数除以它都将趋近于0。
if (dividend == 0)
return 0;
if (dividend == Integer.MIN_VALUE && divisor == -1)
return Integer.MAX_VALUE;
if(divisor == Integer.MIN_VALUE && dividend == Integer.MIN_VALUE)
return 1;
if(divisor == Integer.MIN_VALUE)
return 0;
2.定义count变量,用于记录“商”值。
int count = 0;
3.确定商值的符号。用三目运算符分别队被除数与除数进行判断,用op变量记录正负。
int op = dividend < 0 ? -1 : 1;
op = divisor < 0 ? -op : op;
4.统一符号,方便运算。通过Math.abs()的方式取他们的绝对值,然后给它们统一转换成负数,方便后续计算。
dividend = -Math.abs(dividend);
divisor = -Math.abs(divisor);
5.循环减法求商值,用变量count记录。
while(dividend<=divisor){
dividend = dividend-divisor;
count++;
}
6.返回求得的商值,记得乘op使其符号正确。
return count*op;