題目描述:編程實現兩個正整數的除法,當然不能用除法操作。
題目來自昨天上午遠程面試牛客網的算法題,數據結構和算法一直是我的薄弱項,所以此次面試最后也不大理想。不得不說,面試官人還是很好的,一直在給我提示,可是終究因為自己能力不夠而沒過。。。
我的答案
剛開始,我寫出了如下的代碼,基本上是符合條件可以運行的:
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.div(2, 3));
System.out.println(s.div(3, 2));
System.out.println(s.div(5, 2));
System.out.println(s.div(6, 2));
}
/**
* 兩個正整數的除法
*
* @param x
* @param y
* @return
*/
public int div(int x, int y) {
if(x < y) {
return 0;
}
int res = 0;
while(x - y >= 0) {
res++;
x = x - y;
}
return res;
}
}
代碼雖然可以正確運行,但是確實有效率問題的:比如說,當 x 很大 y 卻很小時。
面試官說:可以利用類似二分查找的思想來提高效率
我說:二分查找求中值是需要除法的啊,但是這道題目規定不能使用除法的
面試官說:求中值不一定非得用除法,比如可以用移位操作
然后我雖然有了點思路,但並沒有清楚的表達出來。現在已經面試完了,就在寫下這種方法吧:
/**
* Created by clearbug on 2018/2/26.
*/
public class Solution {
public static void main(String[] args) {
Solution s = new Solution();
System.out.println(s.div(2, 3));
System.out.println(s.div(3, 2));
System.out.println(s.div(5, 2));
System.out.println(s.div(6, 2));
System.out.println(s.div(13, 3));
System.out.println(s.div(26, 3));
System.out.println(s.div(26, 2));
}
/**
* 兩個正整數的除法
*
* @param x
* @param y
* @return
*/
public int div(int x, int y) {
if(x < y) {
return 0;
}
int res = 0;
while (x >= y) {
int multi = 1;
while (y * multi <= x >> 1) {
multi = multi << 1;
}
res += multi;
x = x - y * multi;
}
return res;
}
}
好吧,我承認我自己並沒有寫出來,我是參考了這位老鐵的代碼寫的:http://www.xuebuyuan.com/3120516.html。
現在我也沒完全想明白為啥要與 x 的一半做比較,以后想明白了再說吧!