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-LeetCode中等29兩數相除JavaLeetCode
- LeetCode 29——兩數相除LeetCode
- python LeetCode 兩數相除PythonLeetCode
- 29.兩數相除
- 7.0 列印兩個常量整數
- 力扣第29題 中等難度 兩數相除力扣
- 【JAVA習題六】輸入兩個正整數m和n,求其最大公約數Java
- 二分法(整數型別)的基本框架型別框架
- java 給出兩個整數a和b , 求他們的和。不用用運算子+Java
- 求兩個整數之和——一個寫註釋的新手
- 求眾數、排序演算法、二分法排序演算法
- leetcode:確實的第一個整數(java)LeetCodeJava
- 輸入一個整數,返回這個整數的位數
- C----判斷兩個整數乘積幾進位制
- 使用純粹的ABAP位操作實現兩個整數相加
- 2034 整數的個數
- 演算法-兩個排序陣列的中位數演算法排序陣列
- 演算法-兩數之和演算法
- 演算法-兩數相加演算法
- Java整數緩衝區Java
- 求兩個正整數的最大公約數與最小公倍數--C#實現C#
- Java二分法Java
- 演算法第四版-找兩個數的最大公約數演算法演算法
- Java中計算兩個日期間的天數Java
- 一個小小的演算法題:求兩數之和演算法
- [演算法] 兩個質數的乘積是707829217,求解該質數演算法
- 力扣演算法經典第一題——兩數之和(Java兩種方式實現)力扣演算法Java
- 1006 換個格式輸出整數 (15分)【java題解】Java
- 【演算法-java實現】合併兩個有序連結串列演算法Java
- 翻轉一個整數
- 演算法設計與分析:求兩個自然數的最大公約數演算法
- 【演算法分析與設計】輾轉相除法演算法
- 兩個報錯就想把我整懵嗎
- java 生成一個隨機整數,範圍從 1 到 10Java隨機
- 兩數之和(leecode)的演算法演算法
- stackoverflow 提問:“計算兩個整數的最小公倍數的最有效方法是什麼?”
- 輸入10個整數,求最大數
- 求最大公約數(輾轉相除法)
- RSA演算法中,為什麼需要的是兩個素數?演算法