题目
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的符号是否相同
- 能用位运算尽量使用位运算
网友评论