Java 演算法-兩個整數相除(二分法)
每天都要督促自己做面試題!
題意:
將兩個整數相除,要求不使用乘法、除法和 mod 運算子。
如果溢位,返回 2147483647 。
樣例:
給定被除數 = 100 ,除數 = 9,返回 11。
這個題說實話,如果直接除以的話,不難的,但是題上說了不能使用乘法和除法,所以只有使用加減法,但是加減法有太慢了,所以想到了位運算,<<1表示左移一位,表示乘以2。
1.解題思路
我們將被除數迴圈減去除數(這個是要變得),減過一次,如果被除數>=除數的話,就讓除數乘以2(<<1),並且增量也要乘以2,因為倍數原來的兩倍。
我們假設,result 用來記錄最終的結果,cnt表示每次的增量,temp表示變換的除數,每次被除數減去temp之後,cnt<<1,同時temp<<1。
說的我都有點亂了,直接看程式碼
2.程式碼
public int divide(int dividend, int divisor) {
if(divisor == 0) {
return 2147483647;
}
long result = 0;
long d1 = Math.abs((long)dividend);
long d2 = Math.abs((long)divisor);
while(d1 >= d2) {
long temp = d2; //變換的除數
long cnt = 1; //增量
while(d1 >= temp) {
//如果被除數大於等於temp(變換的除數),result += cnt
result += cnt;
d1 -= temp; //被除數減去除數
cnt = cnt << 1;
temp = temp << 1;
}
}
if(dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0) {
result = -result;
}
if(result < Integer.MIN_VALUE || result > Integer.MAX_VALUE) {
result = 2147483647;
}
return (int) result;
}
相關文章
- Java 兩個整數相除保留兩位小數,將小數轉化為百分數Java
- JAVA-LeetCode中等29兩數相除JavaLeetCode
- LeetCode 29——兩數相除LeetCode
- python LeetCode 兩數相除PythonLeetCode
- [LeetCode] Divide Two Integers 兩數相除LeetCodeIDE
- Divide Two Integers不使用乘除法來計算兩個數相除IDE
- 二分法(整數型別)的基本框架型別框架
- 資料結構與演算法——兩個大整數的乘積問題資料結構演算法
- 【JAVA習題六】輸入兩個正整數m和n,求其最大公約數Java
- java 給出兩個整數a和b , 求他們的和。不用用運算子+Java
- 排序演算法-N個正整數排序排序演算法
- Java判斷一個整數是否為奇數Java
- java求一個整數的最小因子Java
- 求眾數、排序演算法、二分法排序演算法
- 輸入一個整數,返回這個整數的位數
- java計算兩個日期相差年數Java
- C----判斷兩個整數乘積幾進位制
- 使用純粹的ABAP位操作實現兩個整數相加
- 獲取兩個數之間的隨機數-java隨機Java
- 演算法學習-第一個缺失的正整數演算法
- 演算法-兩數之和演算法
- 演算法-兩數相加演算法
- 演算法-兩個排序陣列的中位數演算法排序陣列
- 2034 整數的個數
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- Java二分法Java
- leetcode:確實的第一個整數(java)LeetCodeJava
- Java整數緩衝區Java
- 演算法第四版-找兩個數的最大公約數演算法演算法
- Java中計算兩個日期間的天數Java
- Java中的兩個特殊變數this和super (轉)Java變數
- 一個小小的演算法題:求兩數之和演算法
- 不借助第三方變數實現兩個整數變數值的互換變數
- 歐幾里德演算法(又稱輾轉相除法)求最大公約數,以及最小公倍數演算法
- Java判斷一個正整數是不是2的乘方Java
- 力扣演算法經典第一題——兩數之和(Java兩種方式實現)力扣演算法Java
- 【演算法分析與設計】輾轉相除法演算法
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法