摘要:很容易想到,我们每次用被除数减去除数,进行减法的次数就是最终结果。这道题的采取了一种类似二分查找的思想。除了这些,这道题还要注意一些边界情况的判断,例如除数或被除数为,值溢出等。
题目详情
Divide two integers without using multiplication, division and mod operator.想法
If it is overflow, return MAX_INT.题目要求我们在不借助乘法运算、除法运算和模运算的基础上,求出输入的两个整数相除的结果。如果溢出,那么返回MAX_INT。其中第一个参数是被除数,第二个参数是除数。
这道题既然不能借助乘、除、模三种运算,我们只能运用加减法求结果。
很容易想到,我们每次用被除数减去除数,进行减法的次数就是最终结果。但是这种方法在遇到被除数很大,而除数很小的情况时,运算时间太长,会导致超时。
这道题的采取了一种类似‘二分查找’的思想。对于每一次运算,我们要尽可能找出除数的倍数n,使得n倍的除数尽可能接近被除数的大小。
如何找到这个倍数n呢?我们每次将除数翻倍,倍数为1,2,4,8,16...直到除数的n倍比被除数大。
这个时候我们就用被除数减去n倍的除数,继续这样计算下去。
最后我们得到的所有倍数的和,就是最后的答案。
除了这些,这道题还要注意一些边界情况的判断,例如除数或被除数为0,值溢出等。
解法public int divide(int dividend, int divisor) { boolean isPositive = true; if((dividend < 0 && divisor >0) || (dividend > 0 && divisor < 0)){ isPositive = false; } long ldividend = Math.abs((long)dividend); long ldivisor = Math.abs((long)divisor); if(ldivisor == 0)return Integer.MAX_VALUE; if(ldividend == 0)return 0; long lans = ldivide(ldividend, ldivisor); int ans; if (lans > Integer.MAX_VALUE){ ans = (isPositive)? Integer.MAX_VALUE : Integer.MIN_VALUE; } else { ans = (isPositive) ? (int)lans : -(int)lans; } return ans; } private long ldivide(long ldividend, long ldivisor) { if (ldividend < ldivisor) return 0; long sum = ldivisor; long multiple = 1; while ((sum+sum) <= ldividend) { sum += sum; multiple += multiple; } return multiple + ldivide(ldividend - sum, ldivisor); }
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68841.html
Problem Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator. Return the quotient after dividing dividend by divisor. The integer divisi...
摘要:题目解析用加减法实现除法用减法,每次累加被减部分,累加商,以一个固定的倍数递增坑注意循环的跳出便捷,的情况要注意。应用累加思想,可以用在提速上,效率提高如果,则是负的,则是正的 题目解析: 用加减法实现除法 用减法,每次累加被减部分,累加商, 以一个固定的倍数递增 坑: 注意 while循环的跳出便捷,= 的情况要注意。应用:累加思想,可以用在提速上,效率提高 Given two ...
摘要:题目要求在不使用乘法,除法和求余操作的情况下,计算两个整数相除的结果。如果溢出了,则返回最大值。在这里核心思路是使用逆向二分法和递归的思路来进行计算。在这里我们使用取值范围更广的来处理数值溢出的场景。 题目要求 Divide two integers without using multiplication, division and mod operator. If it is o...
摘要:上篇文章写了以我自己的思路来解决这个问题,但是运行时间过长,看了上的高效写法是使用位运算的解法,当初我自己写这个问题是也想到了可以用位运算快一点,但是因为基础差,对位运算的掌握不牢靠,还是选择使用了减法的思路,在此将上高效解法做一个思路分析 上篇文章写了以我自己的思路来解决这个问题,但是运行时间过长,看了leetcode 上的高效写法是使用位运算的解法,当初我自己写这个问题是也想到了可...
摘要:位操作法复杂度时间空间思路我们设想,本来应该的得到余,那么如果我们把忽略余数后分解一下,,也就是,也就是把商分解为,所以商的二进制是。我们可以不断的将乘的一次方,二次方,等等,直到找到最大那个次方,在这里是的四次方。 Divide Two Integers Divide two integers without using multiplication, division and m...
阅读 1789·2021-11-24 10:21
阅读 1201·2021-09-22 15:25
阅读 3164·2019-08-30 15:55
阅读 703·2019-08-30 15:54
阅读 3455·2019-08-30 14:20
阅读 1652·2019-08-30 14:06
阅读 634·2019-08-30 13:11
阅读 3134·2019-08-29 16:43