Divide Two Integers
视频讲解 http://v.youku.com/v_show/id_XMTY1MTAyODM3Ng==.html
int 范围:
Integer.MIN_VALUE => -2147483648 Integer.MAX_VALUE => 2147483647
overflow:
当被除数为 Integer.MIN_VALUE的时候,取绝对值或者除以-1都会造成溢出overflow.
Math.abs(-2147483648) => -2147483648 Integer.MIN_VALUE/(-1) => -2147483648
(1)把两个数转化成long类型,可以得到正确的绝对值
Long.MAX_VALUE => 9223372036854775807 Long.MIN_VALUE => -9223372036854775808 long a = Math.abs((long)dividend); long b = Math.abs((long)divisor); Math.abs((long)-2147483648) => 2147483648
(2)题目中给出If it is overflow, return MAX_INT.
if(dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE;
a=0,b=0, leetcode这道题中这个test case没有处理,所以暂时不需要考虑。
a<b, 被除数小于除数,结果为0。
a>=b, 通过b位移来得到b和a之间的倍数关系。
4<<1 => 4*2,
4<<2 => 4*2*2,
4<<3 => 4*2*2*2,
a=25, b=4, result =0
当a>=b, a>0,b>0
int count =0;记录位移的位数,
如果a> b<<(count+1), count++;
(1) count =0: 25 > 4<<1, 4*2=8 , count++;
count=1: 25 > 4<<2, 4*2*2=16, count++;
count=2: 25 > 4<<3, 4*2*2*2=32不成立,
本轮循环结束,count=2;
result += 1<<count; result =1*2*2=4;
a -= b<<count, a = 25 - 4*2*2 =9;
(2)count=0, 9 > 4<<1, 4*2=8,count++;
count=1, 9 > 4<<2, 4*2*2=16不成立,count=1
本轮结束循环, count=1,
result += 1<<count; result=4+1*2=6;
a -= b<<count, 9-4*2=1, 1<4整个循环结束
由于a和b是被除数和除数的绝对值,如何判断两者符号是否相同?
1^1 => 0
1^0 => 1
true^false => true
true^true => false
false^false => false
((dividend>0)^(divisor>0))?(-result):result
符号相同则为false,取result
不同则为true,取-result的值
public class Solution {
public int divide(int dividend, int divisor) { if(dividend == Integer.MIN_VALUE && divisor == -1) return Integer.MAX_VALUE; long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor); if(a<b) return 0; int result = 0; while(a>0 && b>0 && a>=b){
int count = 0;
while(a> b<<(count+1)){
count++;
}
result += 1<<count;
a -= b<<count;
}
return ((dividend>0)^(divisor>0))?(-result):result;
}
}
Divide Two Integers的更多相关文章
- [LeetCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- Leetcode Divide Two Integers
Divide two integers without using multiplication, division and mod operator. 不用乘.除.求余操作,返回两整数相除的结果,结 ...
- leetcode-【中等题】Divide Two Integers
题目 Divide two integers without using multiplication, division and mod operator. If it is overflow, r ...
- [LintCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- 62. Divide Two Integers
Divide Two Integers Divide two integers without using multiplication, division and mod operator. 思路: ...
- Divide Two Integers leetcode
题目:Divide Two Integers Divide two integers without using multiplication, division and mod operator. ...
- Java for LeetCode 029 Divide Two Integers
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- [LeetCode] Divide Two Integers( bit + 二分法 )
Divide two integers without using multiplication, division and mod operator. 常常出现大的负数,无法用abs()转换成正数的 ...
- LeetCode29 Divide Two Integers
题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, ...
- 【leetcode】Divide Two Integers (middle)☆
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
随机推荐
- java编程思想-接口总结
"确定接口是理想选择,因而应该总是选择接口而不是具体的类."这其实是一种诱饵.当然,对于创建类,几乎在任何时刻,都可以替代为创建一个接口和一个工厂. 许多人都掉进了这种诱惑的陷阱, ...
- BZOJ4620: [Wf2016]What Really Happened on Mars?
题意比较难懂?反正我为此特地查了优先级倒置和优先级置顶协议是什么. 读懂题以后就好办了,直接模拟即可. 由于数据范围较小,写得比较暴力,应该还有很大优化空间. #include<cstdio&g ...
- TCP/IP详解
第一篇 TCPIP协议详解 第1章 TCPIP协议族 第2章 IP协议详解 第3章 TCP协议详解 第4章 TCP/IP通信案例:访问Internet上的Web服务器 一.TCP/IP协议族 TCP/ ...
- TEXshade教程- 多重比对着色软件包
多重比对着色软件包 TEXshade 图解安装教程 [絮语]: TEXshade 是 Latex 的一个宏包,可以对 MSF或 ALN 格式的多重比对文件以不同的方式进行着色美化,并可以对重要的位 ...
- Autofac.Integration.Mvc分析
Autofac.Integration.Mvc static ILifetimeScope LifetimeScope { get { return (ILifetimeScope)HttpConte ...
- Jsp与servlet的区别 1
Jsp与servlet的区别 2011-12-09 16:27:47 分类: Java 1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识 ...
- Linux python <tab>自动补全
为Python添加交互模式下TAB自动补全以及命令历史功能. 1.获取python目录 [root@localhost ~]# python Python 2.6.6 (r266:84292, Jul ...
- Windows溢出提权小结
1. 查看系统打补丁情况:systeminfo 2. 查看KB-EXP表: KB2360937 MS10-084 KB2478960 MS11-014 KB2507938 MS11-056 KB2 ...
- MIT Scheme 使用 Edwin
MIT Scheme 的基本使用:http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm 安装过程 安装bre ...
- RabbitMQ service is already present - only updating service parameters
如果你安装RabbitMQ不是那么一番顺利..那么你有可能会重装多次.. So..问题来了..重装时你执行 rabbitmq-service install 的时候..有可能就会报这个错了.. ...