视频讲解  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. windows系统下安装MySQL

    可以运行在本地windows版本的MySQL数据库程 序自从3.21版以后已经可以从MySQL AB公司获得,而且 MYSQL每日的下载百分比非常大.这部分描述在windows上安装MySQL的过程. ...

  2. 阻塞式socket例子学习

    /************************************************************************* > File Name: Win_Serve ...

  3. IntelliJ IDEA 当pom.xml更新时,自动加载pom.xml

    http://stackoverflow.com/questions/19444471/intellij-idea-how-to-synchronize-project-libraries-with- ...

  4. 自定义layout中需要重写的方法

    Layout类中,有3个方法是必定会被依次调用: prepareLayout: 准备所有view的layoutAttribute信息 collectionViewContentSize: 计算cont ...

  5. BootStrap学习------栅格

    使用Bootstrap前端框架-栅格 要点 1.使用Bootstrap需要引入的css和js: (1)bootstrap.min.js (2)bootstrap.min.css 2.栅格系统需要通过& ...

  6. VisualStudio基本使用(1)-显示行号

    "工具"-"选项"-"文本编辑器"-"C/C++"-"常规",勾选"行号"复选框 ...

  7. PHP mkdir()无写权限的问题解决方法

    这篇文章主要介绍了PHP mkdir()无写权限的问题解决方法,对umask做了详细解释以及mkdir()后没写权限的解决方法,需要的朋友可以参考下   使用mkdir创建文件夹时,发现这个函数有两个 ...

  8. Sphinx扩展安装安装

    Coreseek官方教程中建议php使用直接include一个php文件进行操作,事实上php有独立的sphinx模块可以直接操作coreseek(coreseek就是sphinx!)已经进入了php ...

  9. Javascript 方法大全

    一.基础知识 1 创建脚本块 1: <script language=”JavaScript”> 2: JavaScript code goes here 3: </script&g ...

  10. Google Protocol Buffer 简单介绍

    以下内容主要整理自官方文档. 为什么使用 Protocol Buffers .proto文件 Protocol Buffers 语法 编译.proto文件 Protocol Buffers API 枚 ...