欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

LeetCode算法题-29.两数相除.移除列表元素-javascript(三十二)

程序员文章站 2024-03-09 12:00:35
...

解法一(边界法)

LeetCode算法题-29.两数相除.移除列表元素-javascript(三十二)

function divide(dividend, divisor) {
	//除数为0返回-1,测试用例写的
	if (divisor == 0) return -1;
	//被除数为0返回0
	if (dividend == 0) return 0;
	//除数为1返回被除数
	if (divisor == 1) return dividend;
	//极端用例,负数的最大绝对值大于正数最大绝对值
	if (dividend==-2147483648 && divisor==-1) return 2147483647;
	if (dividend==-2147483648 && divisor==1) return -2147483648;
	//由于-2147483648取反会溢出,所以全部转成负整数
	var x = divisor > 0 ? -divisor : divisor;
	var y = dividend > 0 ? -dividend : dividend;
	//当被除数小于除数时,还可以除
	var ans = 0;
	while (y <= x) {
		var i = 1, xi = x << i;
		//当被除数加上除数的2倍、4倍、8倍还小于0时,继续加x<<i,注意x<<i仍然是负数
		while (xi < 0 && y - xi < 0) {
			i++;
			xi = x << i;
		}
		//由于是指数倍加上除数的倍数的绝对值,把被除数接近到差刚刚小于0的情况
		y -= (x << (i - 1));
		//被除数加上除数i-1的指数倍,商包含1<<(i-1)
        ans += (1 << (i - 1));
	}
	//异或取反,此时ans不存在溢出问题
    if (dividend > 0 ^ divisor > 0) ans = -ans;
    return ans;
}

解法二(暴力法)