美文网首页
29. Divide Two Integers

29. Divide Two Integers

作者: Al73r | 来源:发表于2017-09-28 09:20 被阅读0次

    题目

    Divide two integers without using multiplication, division and mod operator.

    If it is overflow, return MAX_INT.

    分析

    就是用加减法来实现整除。直接让被除数一次次减去除数并计数的复杂度为O(n),会超时。

    class Solution {
    public:
        int divide(int dividend, int divisor) {
            if(divisor==0 || (dividend==INT_MIN && divisor==-1)) return INT_MAX;
            int ans=0;
            int sign=1;
            if((dividend<0 && divisor>0) || (dividend>0 && divisor<0))
                sign=-1;
            dividend = dividend>0 ? dividend : -dividend;
            divisor = divisor>0 ? divisor : -divisor;
            while(dividend-divisor>=0){
                dividend-=divisor;
                ans++;
            }
            return sign>0 ? ans : -ans;
        }
    };
    

    考虑用位运算翻倍除数,进行计算,可以使得复杂度降低到O(log(n))

    实现

    class Solution {
    public:
        int divide(int dividend, int divisor) {
            if(divisor==0 || (dividend==INT_MIN && divisor==-1))
                return INT_MAX;
            long long a = labs(dividend);
            long long b = labs(divisor);
            long long c=b;
            long long i=1;
            while((c<<1)<=a){
                c <<= 1;
                i <<= 1;
            }
            int ans = 0;
            while(c>=b){
                if(a>=c){
                    a -= c;
                    ans += i;
                }
                c >>= 1;
                i >>= 1;
            }
            return (dividend ^ divisor)>>31 ? -ans : ans;
        }
    };
    

    思考

    一些技巧总结,包括:

    • long long 型的取绝对值使用 labs(a)函数
    • a^b>>31 判断两个int的符号是否相同
    • 能用位运算尽量使用位运算

    相关文章

      网友评论

          本文标题:29. Divide Two Integers

          本文链接:https://www.haomeiwen.com/subject/tnfmextx.html