Divide Two Integers
题意:写一个整数之间的除法,不可以用* / %运算符
解法:
O(1):最暴力的方式一定是不停的试商,那么商的范围是连续的,所以一定可以采用二分的方式进行尝试,但因为题中要求不可以用*,所以要自己去实现一个mul(a,b),当然采用位运算。每次乘法计算由于int位数是常数,所以是O(1)的,而商的范围是int,所以log(2^31)也是常数,所以整个算法复杂度是O(1).
public class Solution124 {
public int divide(int dividend, int divisor) {
long dividend2=dividend;
long divisor2=divisor;
if (dividend2==0){
return 0;
}
if (divisor2==0){
return 0;
}
boolean label=false;
if(dividend2<0&&divisor2>=0){
label=true;
}
if(dividend2>=0&&divisor2<0){
label=true;
}
if (dividend2<0){
dividend2=-dividend2;
}
if (divisor2<0){
divisor2=-divisor2;
}
if (dividend2==divisor2){
return label?-1:1;
}
if (dividend2<divisor2){
return 0;
}
if (divisor2==1){
returnlabel?(int)(-dividend2):(int)dividend2;
}
longtemp=binarySearch(dividend2,divisor2,1,dividend2-1);
return label?(int)(-temp):(int)temp;
}
privatelong binarySearch(long dividend2,long divisor2,long x, long y) {
if(myMul(x,divisor2)==dividend2){
returnx;
}
if(myMul(y,divisor2)==dividend2){
returny;
}
longmid=(x+y)>>1;
if(myMul(mid,divisor2)==dividend2){
returnmid;
}
if(myMul(y,divisor2)<dividend2){
returny;
}
if(y-x==1){
returnx;
}
if(myMul(mid,divisor2)>dividend2){
returnbinarySearch(dividend2,divisor2,x,mid);
}else{
returnbinarySearch(dividend2,divisor2,mid,y);
}
}
publiclong myMul(long x,long y){
longans=0;
for(int i=1;i<32;i++){
longnewY=y>>i<<i;
if(y-newY>0){
ans+=x<<(i-1);
}
y=newY;
}
returnans;
}
}
另外一种解法:每次将除数不停的扩大一倍,直到超过被除数,用被除数减去对应的数,并把这部分的结果加入ans,重复迭代,直到除数不扩大也大于被除数。