视频讲解  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的更多相关文章

  1. [LeetCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  2. Leetcode Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. 不用乘.除.求余操作,返回两整数相除的结果,结 ...

  3. leetcode-【中等题】Divide Two Integers

    题目 Divide two integers without using multiplication, division and mod operator. If it is overflow, r ...

  4. [LintCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  5. 62. Divide Two Integers

    Divide Two Integers Divide two integers without using multiplication, division and mod operator. 思路: ...

  6. Divide Two Integers leetcode

    题目:Divide Two Integers Divide two integers without using multiplication, division and mod operator. ...

  7. Java for LeetCode 029 Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  8. [LeetCode] Divide Two Integers( bit + 二分法 )

    Divide two integers without using multiplication, division and mod operator. 常常出现大的负数,无法用abs()转换成正数的 ...

  9. LeetCode29 Divide Two Integers

    题目: Divide two integers without using multiplication, division and mod operator. If it is overflow, ...

  10. 【leetcode】Divide Two Integers (middle)☆

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

随机推荐

  1. java编程思想-接口总结

    "确定接口是理想选择,因而应该总是选择接口而不是具体的类."这其实是一种诱饵.当然,对于创建类,几乎在任何时刻,都可以替代为创建一个接口和一个工厂. 许多人都掉进了这种诱惑的陷阱, ...

  2. BZOJ4620: [Wf2016]What Really Happened on Mars?

    题意比较难懂?反正我为此特地查了优先级倒置和优先级置顶协议是什么. 读懂题以后就好办了,直接模拟即可. 由于数据范围较小,写得比较暴力,应该还有很大优化空间. #include<cstdio&g ...

  3. TCP/IP详解

    第一篇 TCPIP协议详解 第1章 TCPIP协议族 第2章 IP协议详解 第3章 TCP协议详解 第4章 TCP/IP通信案例:访问Internet上的Web服务器 一.TCP/IP协议族 TCP/ ...

  4. TEXshade教程- 多重比对着色软件包

    多重比对着色软件包 TEXshade 图解安装教程   [絮语]: TEXshade 是 Latex 的一个宏包,可以对 MSF或 ALN 格式的多重比对文件以不同的方式进行着色美化,并可以对重要的位 ...

  5. Autofac.Integration.Mvc分析

    Autofac.Integration.Mvc static ILifetimeScope LifetimeScope { get { return (ILifetimeScope)HttpConte ...

  6. Jsp与servlet的区别 1

     Jsp与servlet的区别 2011-12-09 16:27:47 分类: Java 1.jsp经编译后就变成了Servlet.(JSP的本质就是Servlet,JVM只能识别java的类,不能识 ...

  7. Linux python <tab>自动补全

    为Python添加交互模式下TAB自动补全以及命令历史功能. 1.获取python目录 [root@localhost ~]# python Python 2.6.6 (r266:84292, Jul ...

  8. Windows溢出提权小结

    1.  查看系统打补丁情况:systeminfo 2.  查看KB-EXP表: KB2360937 MS10-084 KB2478960 MS11-014 KB2507938 MS11-056 KB2 ...

  9. MIT Scheme 使用 Edwin

    MIT Scheme 的基本使用:http://www.math.pku.edu.cn/teachers/qiuzy/progtech/scheme/mit_scheme.htm 安装过程 安装bre ...

  10. RabbitMQ service is already present - only updating service parameters

    如果你安装RabbitMQ不是那么一番顺利..那么你有可能会重装多次.. So..问题来了..重装时你执行   rabbitmq-service install  的时候..有可能就会报这个错了.. ...