LeetCode - Divide Two Integers
来源:互联网 发布:css 开发工具 知乎 编辑:程序博客网 时间:2024/06/16 18:10
https://leetcode.com/problems/divide-two-integers/
Divide two integers without using multiplication, division and mod operator.
If it is overflow, return MAX_INT.
这道题的解法一个是不断地用被除数减去除数,直到被除数比除数小为止。这个解法时间是O(n)另外一个解法就是把除数不断左移一位,直到比被除数大为止,然后被除数再减去左移后比被除数小的最大值,再重复上述过程,直到被除数比除数小为止。
这个解法的时间复杂度是 O(lgn)
比较麻烦的就是各种corner case!!!注意,Math.abs(Integer.MIN_VALUE)等于它自己,并不会返回一个正值。而且如果被除数最高位是1(比如Integer.MAX_VALUE),那么除数不管怎么左移都可能不会比被除数大,因为一到最右边再移就移出32位了,所以移位的时候用long来移,这样循环终止条件才有效。
代码如下:
public int divide(int dividend, int divisor) { if(divisor==0) return Integer.MAX_VALUE; if(divisor == 1 || divisor==-1){ if(divisor==1) return dividend; if(divisor==-1){ return dividend == Integer.MIN_VALUE ? Integer.MAX_VALUE: -dividend; //-Integer.MIN_VALUE is bigger than Integer.MAX_VALUE } } if(divisor==Integer.MIN_VALUE) return dividend==Integer.MIN_VALUE? 1: 0; if(dividend ==0) return 0; boolean isNeg = true; if((dividend>0 && divisor>0) || (dividend<0 && divisor<0)) isNeg = false; int rst = 0; if(dividend == Integer.MIN_VALUE){ dividend += Math.abs(divisor); //Math.abs(Integer.MIN_VALUE) will still return MIN_VALUE, smart trick to deal with this case rst++; } dividend = Math.abs(dividend); divisor = Math.abs(divisor); while(dividend>=divisor){ int val = 1; long tmp = divisor; while((tmp<<1) < dividend){ val = val<<1; tmp = tmp<<1; } rst += val; dividend -= (int)tmp; } return isNeg? -rst : rst; }
0 0
- LeetCode: Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode: Divide Two Integers
- [LeetCode] Divide Two Integers
- [Leetcode] Divide Two Integers
- LeetCode Divide Two Integers
- 【leetcode】Divide Two Integers
- [LeetCode]Divide Two Integers
- LeetCode-Divide Two Integers
- LeetCode: Divide Two Integers
- Divide Two Integers - leetcode
- Leetcode: Divide Two Integers
- LeetCode:Divide Two Integers
- leetcode Divide Two Integers
- LeetCode Divide Two Integers
- LeetCode | Divide Two Integers
- Leetcode: Divide Two Integers
- Divide Two Integers -- LeetCode
- Android—2015年代做安卓毕业设计 Android毕业设计毕业设计AndroidAPP
- OpenGL学习笔记-2015.3.24——transform feedback缓存&粒子系统示例分析
- jQuery源码学习(版本1.11)-整体架构
- 插件笔记_CryptoPlayerPrefs-1.3.3
- search - fibonacci search
- LeetCode - Divide Two Integers
- LeetCode - Add Binary
- C++之强制类型转换原理
- 火狐、IE、Chrome已进入三国时代
- Android开发之Intent
- LeetCode - Factorial Trailing Zeroes
- LeetCode - Excel Sheet Column Title
- a标签页面内跳转 链接被后台地址过滤器拦截
- LeetCode - Excel Sheet Column Number