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 ...
随机推荐
- 利用百度开发者中心的api实现地图及周边的搜索
<html> <head> <meta http-equiv="Content-Type" content="text/html; char ...
- C#中使用DateTimePicker控件显示修改日期时间
1.只显示日期 默认就是 2.只显示时间 修改属性 Format 设为Time ShowUpDown设为true 3.同时显示日期时间 Format设为Custom CustomF ...
- Java字符串方法
1.字符串和字符数组的转换 .toCharArray() String str1 = "hello"; // //System.out.println(str1); char c[ ...
- NGUI架构和Draw Call合并原理
http://bbs.9ria.com/thread-282804-1-1.html http://www.unitymanual.com/blog-97-238.html
- js 连接地址分析
html的连接地址 <a href="/yzh/mobile/index.php?m=default&c=user&a=order_list&cla=dfk&q ...
- Cpu Gpu 内存 显存 数据流
[精]从CPU架构和技术的演变看GPU未来发展 http://www.pcpop.com/doc/0/521/521832_all.shtml 显存与纹理内存详解 http://blog.csdn.n ...
- 安装 SQL server 2008 R2
操作系统:WIN7 问题: The Windows Installer Service could not be accessed. This can occur if the Windows Ins ...
- 微信小程序 教程及示例
作者:初雪链接:https://www.zhihu.com/question/50907897/answer/128494332来源:知乎著作权归作者所有,转载请联系作者获得授权.微信小程序正式公测, ...
- FMDB 多线程使用
在App中保持一个FMDatabaseQueue的实例,并在所有的线程中都只使用这一个实例. [FMDatabaseQueue databaseQueueWithPath:path]; FMDatab ...
- Hadoop生态系统
Hadoop 生态圈