您的位置:首页 > 其它

LeetCode Divide Two Integers

2015-08-17 00:22 483 查看
原题链接在这里:https://leetcode.com/problems/divide-two-integers/

思路: 从dividend里一个一个减divisor一直到余下的数小于divisor停止,算算一共减了多少个divisor,就是答案。

但如此会超时,所以每次要把divisor乘2^k,再减。表示公式就是dividend = divisor * (2^a+2^b+2^c);

e.g 28/3 => 28/3 = (2^3+2^0), answer = 2^3+2^0=9.

Note: 1. 这道题最火大的是overflow,不但要考虑Math.abs()时的溢出,因为Integer.MIN_VALUE 的绝对值 比 Integer.MAX_VALUE 的绝对值大一。

2. 还要考虑一种特殊的corner case: dividend = Integer.MIN_VALUE, divisor = -1, 此时res = Integer.MAX_VALUE +1,所以cast时会出错,要特殊处理。

3. 当以2的幂次方增长时,就用如下方式来写:

while(){
sum+=sum;
pow+=pow;
}


AC Java:

public class Solution {
public int divide(int dividend, int divisor) {
if(divisor == 0){
return Integer.MAX_VALUE;
}

long res = 0;
boolean isNeg = (dividend>0&&divisor<0)||(dividend<0&&divisor>0);
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);

long sum;
long pow;
while(a>=b){
sum = b;
pow = 1;
while(sum+sum<=a){
sum+=sum;
pow+=pow;
}
a-=sum;
res+=pow;
}
res = (isNeg) ? (-res):res;

if(res > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}
return (int)res;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: