29. Divide Two Integers
Description
描述:https://leetcode.com/problems/divide-two-integers/description/
Solution: (Java)
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == Integer.MIN_VALUE) {
if (divisor == -1)
return Integer.MAX_VALUE;
}
int sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1; // ^ 异或,同为假,不同为真
long ldividend = Math.abs((long)dividend);
long ldivisor = Math.abs((long)divisor);
int result = 0;
while (ldividend >= ldivisor) {
// 计算二进制中,左移的位数,left-1才是真正移动的位数
int left = 0;
while (ldividend >= (ldivisor << left)) {
left++;
}
// 被除数减去最大的数(按照二进制的算法)
ldividend -= ldivisor << (left-1);
result += 1 << (left-1);
}
if (sign == 1)
return result;
else
return -result;
}
}
思路
本题题意是两个数的除法,不能用乘除运算,同时考虑溢出的情况,考虑以下几点:
- 参照人手工进行除法时的操作,只不过在计算机中,是按照二进制来;
- 溢出的处理、符号的确定、商的计算;
- 灵活使用
^
、<<
运算符,二进制中左移一位为乘于2,右移一位为除于2; - 由于
int
整数对-2^31
去绝对值无效,所以通过long
长整型来进行运算。