LeetCode Divide Two Integers
2015-08-17 00:22
483 查看
原题链接在这里:https://leetcode.com/problems/divide-two-integers/
思路: 从dividend里一个一个减divisor一直到余下的数小于divisor停止,算算一共减了多少个divisor,就是答案。
但如此会超时,所以每次要把divisor乘2^k,再减。表示公式就是dividend = divisor * (2^a+2^b+2^c);
e.g 28/3 => 28/3 = (2^3+2^0), answer = 2^3+2^0=9.
Note: 1. 这道题最火大的是overflow,不但要考虑Math.abs()时的溢出,因为Integer.MIN_VALUE 的绝对值 比 Integer.MAX_VALUE 的绝对值大一。
2. 还要考虑一种特殊的corner case: dividend = Integer.MIN_VALUE, divisor = -1, 此时res = Integer.MAX_VALUE +1,所以cast时会出错,要特殊处理。
3. 当以2的幂次方增长时,就用如下方式来写:
AC Java:
思路: 从dividend里一个一个减divisor一直到余下的数小于divisor停止,算算一共减了多少个divisor,就是答案。
但如此会超时,所以每次要把divisor乘2^k,再减。表示公式就是dividend = divisor * (2^a+2^b+2^c);
e.g 28/3 => 28/3 = (2^3+2^0), answer = 2^3+2^0=9.
Note: 1. 这道题最火大的是overflow,不但要考虑Math.abs()时的溢出,因为Integer.MIN_VALUE 的绝对值 比 Integer.MAX_VALUE 的绝对值大一。
2. 还要考虑一种特殊的corner case: dividend = Integer.MIN_VALUE, divisor = -1, 此时res = Integer.MAX_VALUE +1,所以cast时会出错,要特殊处理。
3. 当以2的幂次方增长时,就用如下方式来写:
while(){ sum+=sum; pow+=pow; }
AC Java:
public class Solution { public int divide(int dividend, int divisor) { if(divisor == 0){ return Integer.MAX_VALUE; } long res = 0; boolean isNeg = (dividend>0&&divisor<0)||(dividend<0&&divisor>0); long a = Math.abs((long)dividend); long b = Math.abs((long)divisor); long sum; long pow; while(a>=b){ sum = b; pow = 1; while(sum+sum<=a){ sum+=sum; pow+=pow; } a-=sum; res+=pow; } res = (isNeg) ? (-res):res; if(res > Integer.MAX_VALUE){ return Integer.MAX_VALUE; } return (int)res; } }
相关文章推荐
- LeetCode Divide Two Integers
- 文件对象-读操作
- Xcode7 采用空白模版运行错误
- cordova配置文件config.xm
- Linux 下 eclipse 创建快捷方式
- ORA-00257:archiver error问题处理方法
- Python的替换函数——strip(),replace()和re.sub()
- codeforces 566B Replicating Processes
- jQuery AJAX
- ORA-00257:archiver error问题处理方法
- linux添加静态路由
- Linux常用命令002之搜索命令locate、whereis、which、find、grep
- 逆向分析AHpack
- JavaScript的词法结构
- TCP的三次握手(建立连接)和四次挥手(关闭连接)详解
- songCMS 3.15 cookie SQLINJ
- 数据库的类型有哪些
- 如何自定义View
- 全网访问速度优化
- 记一次服务器被恶意攻击的情况