思路一
不能用除法,那就用乘法,設置一個計數器,然後通過比較與的大小,讓計數器累加,不滿足條件跳出循環即可。先對除數和被除數進行處理,都取絕對值,最後返回結果的時候再處理,因爲題目設置的是整數範圍,所以爲了確保處理的正確性,使用類型的臨時變量。
public static int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
long result = 0;
boolean tag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
tag = false;
}
long temp1 = dividend;
long temp2 = divisor;
if (temp1 < 0){
temp1 = - temp1;
}
if (temp2 < 0){
temp2 = - temp2;
}
while (true){
if (result * temp2 <= temp1){
result++;
}else {
break;
}
}
result -= 1;
if (tag){
if (result > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) result;
}
}else {
if (result < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) -result;
}
}
}
結果超時了。。。。。。。。。。因爲如果的絕對值很小,比如1,而卻很大,比如是Integer.MAX_VALUE,這樣時間複雜度就太高了。
思路二
在思路一的基礎上進行優化,思路一相當於每次都減,可以讓其成倍的減,第一次減,下一次就減,
假設divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n = dividend。那麼我們總共只進行了n次操作,這個時間複雜度顯然就是O(log(dividend / divisor))。而如果divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ n > dividend,但是divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1) < dividend,那麼我們就要以dividend - (divisor + divisor * 2 + divisor * 2 ^ 2 + divisor * 2 ^ 3 + ... + divisor * 2 ^ (n - 1))爲被減數進行重複的操作,即從divisor開始減起。直至我們的被減數小於divisor爲止。
public static int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
long result = 0;
boolean tag = true;
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)){
tag = false;
}
long temp1 = dividend;
long temp2 = divisor;
if (temp1 < 0){
temp1 = - temp1;
}
if (temp2 < 0){
temp2 = - temp2;
}
while (temp1 >= temp2){
long k = 1;
long t = temp2;
while (temp1 >= t) {
temp1 -= t;
result += k;
k += k;
t += t;
}
}
if (tag){
if (result > Integer.MAX_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) result;
}
}else {
if (result < Integer.MIN_VALUE){
return Integer.MAX_VALUE;
}else {
return (int) -result;
}
}
}