LeetCode29. 两数相除
两数相除
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
示例 1:
输入: dividend = 10, divisor = 3 输出: 3 解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
示例 2:
输入: dividend = 7, divisor = -3 输出: -2 解释: 7/-3 = truncate(-2.33333..) = -2
解题思路
需要注意一个案例:是 dividend=-2147483648, divisor=-1,则会溢出。
题目要求不能使用除法,可以使用位运算。
1 << 0 1*2^0=0
1 << 1 1*2^1=2
1 << 2 1*2^2=4
3 << 0 3*2^0=3
3 << 1 3*2^1=6
3 << 2 3*2^2=12
Java代码
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0){
return 0;
}
if (dividend == Integer.MIN_VALUE && divisor == -1){
return Integer.MAX_VALUE;
}
int flag = 1;
if ((dividend > 0 && divisor < 0) || (dividend < 0 && divisor > 0)){
flag = -1;
}
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
int result = 0;
int shift = 31;
while (a >= b){
while (a < b << shift){
shift--;
}
result += 1 << shift;
a -= b << shift;
}
return flag * result;
}
}
Python代码
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
if dividend == 0:
return 0
flag = 1
if dividend * divisor < 0:
flag = -1
result = 0
shift = 31
dividend, divisor = abs(dividend), abs(divisor)
while (dividend >= divisor):
while(dividend < divisor << shift):
shift -=1
dividend -= divisor << shift
result += 1 << shift
if flag > 0 and result > 2147483647:
result = 2147483647
if flag < 0 and result > 2147483648:
result = 2147483648
return result * flag