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 ...
随机推荐
- su su- sudo的区别
linux su命令参数及用法详解(linux切换用户命令) su的作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码 linux su 命令 建议大家切换用户的时候 使用 su ...
- nginx 学习笔记(9) 配置HTTPS服务器--转载
HTTPS服务器优化SSL证书链合并HTTP/HTTPS主机基于名字的HTTPS主机带有多个主机名的SSL证书主机名指示兼容性 配置HTTPS主机,必须在server配置块中打开SSL协议,还需要指定 ...
- js003-基本概念
js003-基本概念 3.1 语法 3.1.1 区分大小写 ECMAScript中的一切(变量.函数名和操作符)都是区分大小写的,并且不能用关键字作为函数名:如 typeof. 3.1.2 标识符 所 ...
- centos 安装atop& htop工具
首先安装rpmforge Install RPM for CentOS 5.x 32-BIT wget http://pkgs.repoforge.org/rpmforge-release/rpm ...
- crond不执行原因分析
自己写了个脚本,让crond来周期性执行脚本进行备份,但是在crontab -e里面加入了执行脚本之后,发现没有执行,后来分析了一下,crond不执行的原因主要有以下几个方面: 1.crond服务没启 ...
- paramiko模拟ansible远程执行命令
主模块 #!/usr/bin/env python from multiprocessing import Process import paramiko import time import sys ...
- yii2 小技巧
参考地址:http://www.cnblogs.com/sandea/p/5714830.html 1.不通过日志获取AR执行的原生SQL语句和打印变量数据 $query = User::find() ...
- 浅谈JavaScript中的this
引言 JavaScript 是一种脚本语言,因此被很多人认为是简单易学的.然而情况恰恰相反,JavaScript 支持函数式编程.闭包.基于原型的继承等高级功能.本文仅采撷其中的一例:JavaScri ...
- php概率算法(转)
这是一个很经典的概率算法函数: function get_rand($proArr) { $result = ''; //概率数组的总概率精度 $proSum = array_sum($proArr) ...
- C#实现Excel模板导出和从Excel导入数据
午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.封装的Exc ...