Divide Two Integers
来源:互联网 发布:网络高清硬盘播放机 编辑:程序博客网 时间:2024/06/05 08:11
原题:
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
即不通过乘法、除法、乘方实现两个数相除。
思考过程:
一开始想的是累减的办法,结果超时了:
public int divide1(int dividend, int divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; int res = 0,beiChuShu = Math.abs(dividend),chuShu = Math.abs(divisor); while (beiChuShu >= chuShu){ beiChuShu -= chuShu; res++; } if ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) return res; else return 0 - res; }
后来看到别人思路,是第一次减去除数,第二次减去除数两倍(通过位运算实现),以此类推,直到被除数小于位运算多次的除数,这时让除数恢复原来的值,重复上述过程。
我受启发,想到先把除数通过位运算多次翻倍,直到divisor + dibisor >divident > divisor,然后进行累减。结果超时了(很不明白为什么会超时,我觉得这个时间复杂度不比上一个大。):
public int divide2(int dividend, int divisor) { long res = 0,beiChuShu = Math.abs(dividend),chuShu = Math.abs(divisor); if (dividend == Integer.MIN_VALUE) { if (divisor == -1) return Integer.MAX_VALUE; else beiChuShu = (long)Integer.MAX_VALUE + 1; } long mulOfDivisor = 1; while (beiChuShu - chuShu >= chuShu){ chuShu = chuShu<<1; mulOfDivisor = mulOfDivisor<<1; } while (mulOfDivisor >= 1){ if (beiChuShu >= chuShu) { beiChuShu -= chuShu; res += mulOfDivisor; } chuShu = chuShu>>1; mulOfDivisor = mulOfDivisor>>1; } return (int) (((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))? res:(0 - res)); }
最后乖乖按照上一个思路来的:
public int divide(int dividend, int divisor) { if (dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; long res = 0,beiChuShu = Math.abs((long) dividend),chuShu = Math.abs((long) divisor),mulOfDivisor = 1; while (beiChuShu >= chuShu){ long l = chuShu; mulOfDivisor = 1; while (beiChuShu >= l){ beiChuShu -= l; res += mulOfDivisor; l = l<<1;mulOfDivisor = mulOfDivisor<<1; } }return (int) (((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0))? res:(0 - res)); }
阅读全文
0 0
- LeetCode: Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode: Divide Two Integers
- [LeetCode] Divide Two Integers
- Divide Two Integers
- Divide Two Integers
- LeetCode28:Divide Two Integers
- [Leetcode] Divide Two Integers
- LeetCode Divide Two Integers
- Divide Two Integers
- 【leetcode】Divide Two Integers
- Divide Two Integers
- Divide Two Integers
- [LeetCode]Divide Two Integers
- Divide Two Integers
- LeetCode-Divide Two Integers
- Divide Two Integers
- 25 - Divide Two Integers
- 多线程
- Implement strStr()
- 有序的双向链表
- 史上最简单的 SpringCloud 教程 | 第十四篇: 服务注册(consul)
- 使用javascript写一个进制的计算器
- Divide Two Integers
- PHP字符的显示
- HTML学习之路-2 HTML常用标签
- 在微信浏览器,<intput type="file"> 无法调用手机魅族6pro打开摄像机录视频
- Spring Security(18)——Jsp标签
- Algorithm4——有序向量查找
- 论王者荣耀英雄花木兰
- Kali linux渗透测试(五)
- MQL5-字符串数据