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 ...
随机推荐
- JQuery------如何判断当前点击的是否是哪个类
$(document).ready(function () { $("html").click(function (e) { if (e.target == $(".ad ...
- MySQL------MySQL与SQLServer数据类型的转换
MySQL SQLServer
- android studio中ListView与SQLite的结合使用
Da.java public class Db extends SQLiteOpenHelper { public Db(Context context) { super(context, " ...
- mvn添加本地jar
mvn install:install-file -DgroupId=com.oracle "-DartifactId=ojdbc6" "-Dversion=11.2.0 ...
- Python MySQLdb在Linux下的快速安装
在家里windows环境下搞了一次 见 python MySQLdb在windows环境下的快速安装.问题解决方式 http://blog.csdn.NET/wklken/article/deta ...
- UILabel UISwitch UISegmentedControl UIAlertView
基础小控件 /***************************************UIlabel*************************************/ UILabel ...
- 多日期选择jQuery插件 MultiDatesPicker for jQuery UI
Multiple-Dates-Picker-for-jQuery-UI是一个多日期选择的jquery控件. GIT源码: https://github.com/dubrox/Multiple-Da ...
- paramiko模拟ansible远程执行命令
主模块 #!/usr/bin/env python from multiprocessing import Process import paramiko import time import sys ...
- 为什么要做url encode
因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 url 中不能包含 @ 字符.
- Sqlserver2008 表分区教程
先声明..Sql2008只有企业版才能够搞这个表分区.其他版本请自觉更改.. 哥在这里费了很长时间劲..结果还是老老实实的重装.. 表分区定义 一般情况下,我们建立数据库表时,表数据都存放在一个文件里 ...