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 ...
随机推荐
- gnuplot使用2
设置图中连线的颜色.宽度.连线样式等 set style line 每个显示终端都有默认的线类型和点类型集合,可以通过在命令行输入: test查看,如下图显示了在wxt终端模式下默认的线的集合和点的集 ...
- mysql使用索引优化查询效率
索引的概念 索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针.更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度.在没 ...
- js002-在HTML中使用JavaScript
js002-在HTML中使用JavaScript 2.1 <script>元素 定义了以下6个属性 async: 可选.表示应该立即下载脚本,但不妨碍页面中的 ...
- CentOS7安装mysql5
CentOS7的yum源中默认没有mysql. 1. 下载mysql的repo源 $ wget http://repo.mysql.com/mysql-community-release-el7-5. ...
- 如何修改Linux主机名
Linux 下什么都比较麻烦,就连修改主机名也不例外.我们就下文说一下具体方法. Linux 安装好后,其默认的主机名是 localhost.修改 Linux 主机名需要3步. 使用 hostname ...
- QT的安装和配置及helloqt程序的编写时遇到的问题
1.如果在Windows下命令行编译和运行.cpp 文件,需要找到合适的命令所在文件夹的目录,把它添加到Windows的环境变量里去,SystemPropertiesAdvance. 如qmake 在 ...
- Java——按钮组件:JButton
import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.Point; impor ...
- Markdown 简明语法手册
Markdown 简明语法手册 本文原文http://www.jianshu.com/p/fdb5cbdaf244 根据个人使用情况有所修改. Markdown是一种轻量级标记语言,简称md.创始人为 ...
- C#中操作XML文件
1.添加结点:XmlNode xmldoc.Load("..\\..\\App.config"); //根元素 XmlElement root = xmldoc.DocumentE ...
- BuildingAssetBundles in 5.x
http://docs.unity3d.com/Manual/BuildingAssetBundles5x.html