您的位置:首页 > 其它

leetcode29 Divide Two Integers

2016-09-08 16:28 369 查看
两个整数相除,返回结果,不用返回余数,如果结果溢出返回MAX_INT,不能使用乘法除法或者取余数的运算。

既然不能用乘 除 余 那么可用的是 加 减 位运算

举例:63 / 7 = 9



63 -7 -7 -7 - 7-….一直减到不能减(减的结果<7就是不能减了)为止 计数器统计减了多少次 可行 但网友亲测时间溢出

位运算

64 - 7 - 14 - 28 =15 下一个应该减56 但是已经看到15比56小了 所以不能再减了 应该重新开始 (1+2+4)

从7开始减 也就是15 -7 = 8下一个要减14 但是8已经小于14了 所以不能接着减了(1)

8 - 7 = 1(1)

1不能减(0)

总倍数(1+2+4 + 1+1=9)

改进就在于每次不是单纯的一直-7 而是试图减7*2 7*2*2 这样就可以快一些嘛 为什么不是7*3 7*3*3?因为*2是位运算就可以搞定的事情 *3就要用到乘法了 题目中说不能用乘法了

上代码:

public int divide(int dividend, int divisor) {
int sign = 1 * (dividend>0?1:-1) * (divisor>0?1:-1);
long dividend_l = Math.abs((long)dividend);
long divisor_l = Math.abs((long)divisor);
System.out.println("dividend_l:"+dividend_l+"  divisor_l:" + divisor_l);
long result = 0;
long tempDivesor = divisor_l;
long i = 1;
while(true){
if(dividend_l >= tempDivesor){
dividend_l -= tempDivesor;
tempDivesor <<= 1;
result += i;
i <<= 1;
}
else{
if(tempDivesor == divisor_l){
break;
}
else{
i = 1;
tempDivesor = divisor_l;
}
}
}
if(result*sign < Integer.MAX_VALUE) return (int)result*sign;
else return Integer.MAX_VALUE;
}


这里有一个坑:

测试用例divide(-2147483648,-1)

被除数是integer的最小数 除数是1 如果直接取绝对值就会超过int的最大数 所以应该先转成long 扩大可取值范围 再取绝对值 并把结果存在long里
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  leetcode