[LeetCode-Java]29. Divide Two Integers
2016-10-03 22:05
363 查看
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
解:题目不能用乘除法和取余运算,直接迭代相减又会超时(时间复杂度O(n)),考虑使用移位运算。
比如20/3 , 20 = 3*2^2+3*2^1+2 , 因而20/3 = 2^2+2^1=6.
求解思路:每次将divisor左移位,直到达到小于dividend的最大整数A,此时左移次数为count,即达到an*2^n阶,商大于等于count,然后将dividend-A作为dividend,迭代运算,cout累加到商。
注意:
(1)dividend和divisor的符号。
(2)int的绝对值。int里面有一个特殊的数字:-2147483648,它的绝对值或者相反数 2147483648是超出int的范围的,对于这一情况需要特殊处理。
If it is overflow, return MAX_INT.
解:题目不能用乘除法和取余运算,直接迭代相减又会超时(时间复杂度O(n)),考虑使用移位运算。
比如20/3 , 20 = 3*2^2+3*2^1+2 , 因而20/3 = 2^2+2^1=6.
求解思路:每次将divisor左移位,直到达到小于dividend的最大整数A,此时左移次数为count,即达到an*2^n阶,商大于等于count,然后将dividend-A作为dividend,迭代运算,cout累加到商。
注意:
(1)dividend和divisor的符号。
(2)int的绝对值。int里面有一个特殊的数字:-2147483648,它的绝对值或者相反数 2147483648是超出int的范围的,对于这一情况需要特殊处理。
public int divide(int dividend, int divisor) { if (divisor == 0) return Integer.MAX_VALUE; int result = 0; //获取符号位 >>>为无符号右移 boolean isNegative = (dividend ^ divisor)>>>31 == 1; //因为0x80000000取绝对值会int越界 if(dividend == Integer.MIN_VALUE){ dividend += Math.abs(divisor); if(divisor == -1){ return Integer.MAX_VALUE; } result++; } if (divisor == Integer.MIN_VALUE){ return result; } dividend = Math.abs(dividend); divisor = Math.abs(divisor); while (divisor <= dividend){ //这里最终的temp大于divident,所以定义为long防止int越界 long temp = divisor; int count; for (count = 0;temp <= dividend;count++) { temp <<= 1; } result += (1<<(count-1)); dividend -= (divisor<<(count-1)); } if (isNegative) result = -result; return result; }
相关文章推荐
- (Java)LeetCode-29. Divide Two Integers
- Java [leetcode 29]Divide Two Integers
- LeetCode 29 Divide Two Integers (C,C++,Java,Python)
- 【LeetCode】29. Divide Two Integers
- LeetCode --- 29. Divide Two Integers
- leetcode 29 -- Divide Two Integers
- [Leetcode 29, medium] Divide two integers
- leetcode 29: Divide Two Integers
- [leetcode 29] Divide Two Integers
- LeetCode_29---Divide Two Integers
- LeetCode 29 - Divide Two Integers
- 【LeetCode 29】Divide Two Integers
- [leetcode] 29 Divide Two Integers
- LeetCode 29 - Divide Two Integers
- leetcode[29]Divide Two Integers
- [leetcode 29] Divide Two Integers
- leetcode 29: Divide Two Integers
- leetcode 29 Divide Two Integers
- leetCode 29.Divide Two Integers (两整数相除) 解题思路和方法
- LeetCode(29) Divide Two Integers