Description:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
最笨的实现方式:
在case为(-2147483648, -1)时,运行会超时
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| public int divide(int dividend, int divisor) { if (divisor == 0) { return Integer.MAX_VALUE; } if (dividend == 0) { return 0; } int absDividend = Math.abs(dividend); if (dividend == Integer.MIN_VALUE) { absDividend = -(dividend + 1); } int absDivisor = Math.abs(divisor); int value = 0; while (absDividend >= 0) { absDividend -= absDivisor; if (absDividend >= 0) { value++; } } if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) { return -value; } return value; }
|
更好的实现方式:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
| public int divide(int dividend, int divisor) { if (divisor == 0) { return Integer.MAX_VALUE; } if (dividend == 0) { return 0; } long absDividend = Math.abs((long) dividend); long absDivisor = Math.abs((long) divisor); long tempDivisor = absDivisor; int length = 0; while (tempDivisor != 0) { tempDivisor >>= 1; length++; } long result = 0; for (int i = 32 - length; i >= 0; i--) { if ((absDivisor << i) <= absDividend) { result += (1l << i); absDividend -= (absDivisor << i); } } if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) { return (int)-result; } if (result > Integer.MAX_VALUE) { result = -1 * ((int) result + 1); } return (int)result; }
|
PS :
需要注意几组case:
2147483647,1
2147483647,-1
-2147483648,-1
-2147483648,1