leetcode:29. Divide Two Integers
来源:互联网 发布:python教材推荐知乎 编辑:程序博客网 时间:2024/05/10 12:24
描述
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
思路
这里我一开始的思路是通过减法来实现,不过实现了,超时了。实在想不到什么方法了,参考了一下讨论区,找到大神的思路。使用<<,>> 操作来运算。我在原来的代码基础上,将符号位的判断修改了一下,时间少了。
代码
class Solution {public: int divide(int dividend, int divisor) { if (!divisor || (dividend == INT_MIN && divisor == -1)) return INT_MAX; int sign =(dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0) ? 1 : -1; long long dvd = labs(dividend); long long dvs = labs(divisor); int res = 0; while (dvd >= dvs) { long long temp = dvs, multiple = 1; while (dvd >= (temp << 1)) { temp <<= 1; multiple <<= 1; } dvd -= temp; res += multiple; } return sign == 1 ? res : -res; }};
结果
他山之玉
C++ O(n) solutioin
int divide(int dividend, int divisor) { if(!divisor || (dividend == INT_MIN && divisor == -1)) return INT_MAX; int minus = ((dividend ^ divisor) >> 31) ? -1 : 1; pair<long, long> r = mdiv(labs(dividend), labs(divisor)); return r.first * minus; } pair<long, long> mdiv(long de, long di) { if(de < di) return make_pair(0, de); pair<long, long> sub = mdiv(de >> 1, di); long f, s; f = (sub.first) << 1; s = (sub.second << 1) + (de & 1); if(s >= di) { s -= di; f += 1; } return make_pair(f, s); }
Java O(n) solution
public class Solution { public int divide(int dividend, int divisor) { int sign=(dividend>0&&divisor>0)||(dividend<0&&divisor<0)?1:-1; long divd=Math.abs((long)dividend),divi=Math.abs((long)divisor); long res=0,lo=1,hi=divd; while(lo<=hi){ long mid=lo+(hi-lo)/2; if(mid*divi<=divd){ res=mid; lo=mid+1; }else{ hi=mid-1; } } return res*sign==2147483648L?Integer.MAX_VALUE:(int)res*sign; }}
python O(n) solution
class Solution:# @return an integerdef divide(self, dividend, divisor): positive = (dividend < 0) is (divisor < 0) dividend, divisor = abs(dividend), abs(divisor) res = 0 while dividend >= divisor: temp, i = divisor, 1 while dividend >= temp: dividend -= temp res += i i <<= 1 temp <<= 1 if not positive: res = -res return min(max(-2147483648, res), 2147483647)
0 0
- [LeetCode]29.Divide Two Integers
- LeetCode --- 29. Divide Two Integers
- LeetCode 29.Divide Two Integers
- [Leetcode] 29. Divide Two Integers
- 【leetcode】29. Divide Two Integers
- *LeetCode 29. Divide Two Integers
- leetcode 29. Divide Two Integers
- leetcode 29. Divide Two Integers
- [LeetCode]29. Divide Two Integers
- LeetCode 29. Divide Two Integers
- LeetCode 29. Divide Two Integers
- leetcode 29. Divide Two Integers
- LeetCode-29.Divide Two Integers
- leetcode 29. Divide Two Integers
- leetcode 29. Divide Two Integers
- [leetcode]29. Divide Two Integers
- leetcode 29. Divide Two Integers
- LeetCode - 29. Divide Two Integers
- su提示认证失败
- centos 安装mysql
- 503. Next Greater Element II
- 判断是否正整数[抄]
- Hive函数大全
- leetcode:29. Divide Two Integers
- Linux 防火墙开放特定端口 (iptables)
- 201个核心Java面试问题汇总(2)
- 对Java回调函数的理解
- springmvc整合mybatis框架源码 bootstrap html5 mysql oracle maven SSM
- pentaho下拉框横向排列
- SQL SEVER数据库重建索引的方法
- 什么情况下用weblogic而不用Tomcat
- android中怎么设置color为透明颜色或者半透明颜色