您的位置:首页 > 编程语言 > Java开发

Leet Code 29 Divide Two Integers - 两个整数相除 - Java

2016-06-11 00:00 573 查看
摘要: Leet Code 29 Divide Two Integers - 两个整数相除 - Java

问题原始链接 https://leetcode.com/problems/divide-two-integers

不使用乘、除和模运算,实现两个整数相除。如果溢出,返回 MAX_INT。

第一种方法

被除数不断减去除数,如果能减则商加一,如果不能减,则结束。例如7除以2,初始商为0,首先7-2=5,商为0+1=1,然后5-2=3,商为1+1=2,再然后3-2=1,商为2+1=3,余数1不足以减2,结束,最后返回商为3。

时间复杂度O(被除数/除数)。

这种方法性能低,LeetCode性能超时。

[code=language-java]public class Solution {
public static int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("divisor can not be zero.");
}

if (dividend == 0) {
return 0;
}

if (divisor == 1) {
return dividend;
}

if (divisor == -1) {
if (dividend == Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return -dividend;
}

if (dividend > 0 && divisor > 0) {
return divideBothNegative(-dividend, -divisor);
} else if (dividend < 0 && divisor < 0) {
return divideBothNegative(dividend, divisor);
} else if (dividend < 0 && divisor > 0) {
return -divideBothNegative(dividend, -divisor);
} else {
return -divideBothNegative(-dividend, divisor);
}
}

private static int divideBothNegative(int dividend, int divisor) {
int quotient = 0;
while (dividend - divisor <= 0) {
quotient++;
dividend -= divisor;
}
return quotient;
}
}

第二种方法

设被除数为a,除数为b,假设a和b都是正整数,设商为q=0,首先找到整数n,使2^n*b<=a<=2^(n+1)*b,则q+=2^n,令a=a-2^n*b,然后如果a>=2^(n-1)*b则q+=2^(n-1)且令a=a-2^(n-1)*b,否则判断a与2^(n-1)*b的关系...

[code=language-java]public class Solution {
private static int HALF_MIN_VALUE = Integer.MIN_VALUE >> 1;

public static int divide(int dividend, int divisor) {
if (divisor == 0) {
throw new IllegalArgumentException("divisor can not be zero.");
}

if (dividend == 0) {
return 0;
}

if (divisor == 1) {
return dividend;
}

if (divisor == -1) {
if (dividend == Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return -dividend;
}

if (dividend > 0 && divisor > 0) {
return divideBothNegative(-dividend, -divisor);
} else if (dividend < 0 && divisor < 0) {
return divideBothNegative(dividend, divisor);
} else if (dividend < 0 && divisor > 0) {
return -divideBothNegative(dividend, -divisor);
} else {
return -divideBothNegative(-dividend, divisor);
}
}

private static int divideBothNegative(int dividend, int divisor) {
if (dividend > divisor) {
return 0;
}
if (dividend == divisor) {
return 1;
}

int[] q = new int[31];
int[] d = new int[31];
q[0] = 1;
d[0] = divisor;
int i = 0;
while (d[i] > dividend && d[i] >= HALF_MIN_VALUE) {
i++;
d[i] = d[i - 1] << 1;
q[i] = q[i - 1] << 1;
}

int quotient = 0;
while (dividend <= 0 && i >= 0) {
if (dividend <= d[i]) {
dividend -= d[i];
quotient += q[i];
}
i--;
}
return quotient;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息