剑指 Offer II 001. 整数除法

文章介绍了一种通过转换减法求商为倍数求商的方法,将时间复杂度从O(n)降低到O(logn)。同时,针对数据溢出问题,提出了将正整形和负整形数据转化为负数进行运算的策略,避免越界。在处理INT_MIN/-1这类特殊边界情况下,文章提供了相应的解决方案,并给出了核心的求商算法实现。
摘要由CSDN通过智能技术生成

**加粗样式**
重点:
(1)考虑如何降低时间复杂度
(2)考虑数据溢出的问题

解决:
(1)将减法求商变成倍数来求商,可以从o(n)变成o(logn)
(2)正整形数据的最大数据是2^31-1而负整形数据是2的31次方,所以如果我们直接将负数转变为正数来求是会发生越界现象的。我们应该将数据都转为负数,用负数来做减法。

    首先有处理边界情况,也就是INT_MIN/-1这种情况,然后我们根据原本数据的正负来确定最后数据的正负,并将数据转变为两个负数。
在执行求商算法。最大的结束条件是被除数小于等于除数。每一次计算的结束条件是value大于等于0并且下一次累加后不能小于等于被除数。中间用一个变量去存储加的次数,作为商的值,再用一个变量累加每次的商值,作为最终商值。

class Solution {
public:
    int divide(int a, int b) {
        if (a == INT_MIN && b == -1) {
            return INT_MAX;
        }
        int negative = 2;
        if (a > 0) {
            negative--;
            a = -a;
        }
        if (b > 0) {
            negative--;
            b = -b;
        }
         int ret = divideCore(a, b);
        return negative == 1 ? -ret : ret;
    }

    unsigned int divideCore(int a, int b) {
        int ret = 0;
        // 注意a, b都是负数,所以a <= b就是还可以继续除
        while (a <= b) {
            int value = b;
            unsigned int quo = 1;
            while (value >= 0xc0000000 && a <= value + value) {
                quo += quo;
                value += value;
            }
            ret += quo;
            a -= value;
        }
        return ret;
    }
};

s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值