leetcode29.两数相除——学习笔记

题目:力扣icon-default.png?t=LA92https://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;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hokachi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值