[LeetCode] #29 兩數相除
阿新 • • 發佈:2021-10-11
[LeetCode] #29 兩數相除
給定兩個整數,被除數 dividend 和除數 divisor。將兩數相除,要求不使用乘法、除法和 mod 運算子。
返回被除數 dividend 除以除數 divisor 得到的商。
整數除法的結果應當截去(truncate)其小數部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
輸入: dividend = 10, divisor = 3
輸出: 3
解釋: 10/3 = truncate(3.33333..) = truncate(3) = 3
解法一
class Solution { public int divide(int dividend, intdivisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; if (dividend == Integer.MAX_VALUE && divisor == 1) return Integer.MAX_VALUE; int result = 0; boolean isNeg = (dividend < 0 ^ divisor < 0); dividend = -Math.abs(dividend); divisor= -Math.abs(divisor); while (dividend <= divisor) { int d = divisor; int cnt = 1; while (dividend <= d && d >= -1073741824) { d = d << 1; cnt = cnt << 1; } if (dividend <= d) { dividend-= d; result += cnt; } else { dividend -= d >> 1; result += cnt >> 1; } } return isNeg ? -result : result; } }
解法二
class Solution { public int divide(int dividend, int divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; if (dividend == Integer.MAX_VALUE && divisor == 1) return Integer.MAX_VALUE; int res = 0; boolean isNeg = (dividend < 0 ^ divisor < 0); dividend = -Math.abs(dividend); divisor = -Math.abs(divisor); if(divisor < -1){ while(dividend <= divisor){ int tmp = 1; int div = divisor; while(div >= dividend - div){ div = div<<1; tmp = tmp<<1; } res += tmp; dividend -= div; } }else{ res = 0 - dividend; } return isNeg ? -res : res; } }
知識點:無
總結:無