尼玛考虑负数的情况!而且还有溢出的情况。。。。 -(-2147483648)溢出啦 亲。。。
bit operator的妙用, 左移实现乘2功能
public class Solution {
public int divide(int dividend, int divisor) {
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
boolean pos = false;
if (dividend > 0 && divisor > 0
|| dividend < 0 && divisor < 0) {
pos = true;
}
int ans = 0;
while (a >= b) {
int shift = 0;
while ( (b << shift) <= a) {
shift++;
}
ans += (1 << (shift - 1));
a -= (b << (shift - 1));
}
return pos? ans : -ans;
}
}
如果允许乘法,试着用binary search做了下
//注意dividend是0的情况,这个时候sum总是比被除数大的!
//尼玛考虑负数的情况!而且还有溢出的情况。。。。 -(-2147483648)溢出啦 亲。。。
//要从O(n) -> O(lgn) -> O(1)
public class Solution {
public int divide(int dividend, int divisor) {
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
boolean pos = false;
if (dividend > 0 && divisor > 0
|| dividend < 0 && divisor < 0) {
pos = true;
}
int ans = 0;
long beg = 1;
long end = a;
while (beg <= end) {
long mid = (beg + end)/2;
if (b * mid <= a && b * (mid + 1) > a) {
ans = (int)mid;
break;
}
if (b * (mid + 1) <= a) {
beg = mid + 1;
} else {
end = mid - 1;
}
}
return pos? ans : -ans;
}
}