29. Divide Two Integers

题目

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)