您的位置:首页 > 编程语言 > Java开发

[LeetCode-Java]29. Divide Two Integers

2016-10-03 22:05 363 查看
Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

解:题目不能用乘除法和取余运算,直接迭代相减又会超时(时间复杂度O(n)),考虑使用移位运算。

比如20/3 , 20 = 3*2^2+3*2^1+2 , 因而20/3 = 2^2+2^1=6.

求解思路:每次将divisor左移位,直到达到小于dividend的最大整数A,此时左移次数为count,即达到an*2^n阶,商大于等于count,然后将dividend-A作为dividend,迭代运算,cout累加到商。

注意:

(1)dividend和divisor的符号。

(2)int的绝对值。int里面有一个特殊的数字:-2147483648,它的绝对值或者相反数 2147483648是超出int的范围的,对于这一情况需要特殊处理。

public int divide(int dividend, int divisor) {

if (divisor == 0)  return Integer.MAX_VALUE;

int result = 0;

//获取符号位   >>>为无符号右移
boolean isNegative = (dividend ^ divisor)>>>31 == 1;
//因为0x80000000取绝对值会int越界
if(dividend == Integer.MIN_VALUE){
dividend += Math.abs(divisor);
if(divisor == -1){
return Integer.MAX_VALUE;
}
result++;
}

if (divisor == Integer.MIN_VALUE){
return result;
}

dividend = Math.abs(dividend);
divisor = Math.abs(divisor);

while (divisor <= dividend){
//这里最终的temp大于divident,所以定义为long防止int越界
long temp = divisor;
int count;
for (count = 0;temp <= dividend;count++) {
temp <<= 1;
}

result += (1<<(count-1));
dividend -=  (divisor<<(count-1));
}

if (isNegative) result = -result;

return result;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode