leetcode29 Divide Two Integers
2016-09-08 16:28
369 查看
两个整数相除,返回结果,不用返回余数,如果结果溢出返回MAX_INT,不能使用乘法除法或者取余数的运算。
既然不能用乘 除 余 那么可用的是 加 减 位运算
举例:63 / 7 = 9
减:
63 -7 -7 -7 - 7-….一直减到不能减(减的结果<7就是不能减了)为止 计数器统计减了多少次 可行 但网友亲测时间溢出
位运算:
64 - 7 - 14 - 28 =15 下一个应该减56 但是已经看到15比56小了 所以不能再减了 应该重新开始 (1+2+4)
从7开始减 也就是15 -7 = 8下一个要减14 但是8已经小于14了 所以不能接着减了(1)
8 - 7 = 1(1)
1不能减(0)
总倍数(1+2+4 + 1+1=9)
改进就在于每次不是单纯的一直-7 而是试图减7*2 7*2*2 这样就可以快一些嘛 为什么不是7*3 7*3*3?因为*2是位运算就可以搞定的事情 *3就要用到乘法了 题目中说不能用乘法了
上代码:
这里有一个坑:
测试用例divide(-2147483648,-1)
被除数是integer的最小数 除数是1 如果直接取绝对值就会超过int的最大数 所以应该先转成long 扩大可取值范围 再取绝对值 并把结果存在long里
既然不能用乘 除 余 那么可用的是 加 减 位运算
举例:63 / 7 = 9
减:
63 -7 -7 -7 - 7-….一直减到不能减(减的结果<7就是不能减了)为止 计数器统计减了多少次 可行 但网友亲测时间溢出
位运算:
64 - 7 - 14 - 28 =15 下一个应该减56 但是已经看到15比56小了 所以不能再减了 应该重新开始 (1+2+4)
从7开始减 也就是15 -7 = 8下一个要减14 但是8已经小于14了 所以不能接着减了(1)
8 - 7 = 1(1)
1不能减(0)
总倍数(1+2+4 + 1+1=9)
改进就在于每次不是单纯的一直-7 而是试图减7*2 7*2*2 这样就可以快一些嘛 为什么不是7*3 7*3*3?因为*2是位运算就可以搞定的事情 *3就要用到乘法了 题目中说不能用乘法了
上代码:
public int divide(int dividend, int divisor) { int sign = 1 * (dividend>0?1:-1) * (divisor>0?1:-1); long dividend_l = Math.abs((long)dividend); long divisor_l = Math.abs((long)divisor); System.out.println("dividend_l:"+dividend_l+" divisor_l:" + divisor_l); long result = 0; long tempDivesor = divisor_l; long i = 1; while(true){ if(dividend_l >= tempDivesor){ dividend_l -= tempDivesor; tempDivesor <<= 1; result += i; i <<= 1; } else{ if(tempDivesor == divisor_l){ break; } else{ i = 1; tempDivesor = divisor_l; } } } if(result*sign < Integer.MAX_VALUE) return (int)result*sign; else return Integer.MAX_VALUE; }
这里有一个坑:
测试用例divide(-2147483648,-1)
被除数是integer的最小数 除数是1 如果直接取绝对值就会超过int的最大数 所以应该先转成long 扩大可取值范围 再取绝对值 并把结果存在long里
相关文章推荐
- LeetCode_OJ【29】Divide Two Integers
- LeetCode 29 Divide Two Integers(两个整数相除)(*)
- Java [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 解题报告
- leetcode29 Divide Two Integers
- LeetCode 29 Divide Two Integers
- leetcode题解-29. Divide Two Integers
- leetcode 29:Divide Two Integers