LeetCode: Divide Two Integers 解题报告
Divide Two Integers

Divide two integers without using multiplication, division and mod operator.
SOLUTION 1
1. 基本思想是不断地减掉除数,直到为0为止。但是这样会太慢。
2. 我们可以使用2分法来加速这个过程。不断对除数*2,直到它比被除数还大为止。加倍的同时,也记录下cnt,将被除数减掉加倍后的值,并且结果+cnt。
因为是2倍地加大,所以速度会很快,指数级的速度。
3. 另外要注意的是:最小值的越界问题。对最小的正数取abs,得到的还是它。。。 因为最小的正数的绝对值大于最大的正数(INT)
所以,我们使用Long来接住这个集合就可以了。
public class Solution {
public int divide(int dividend, int divisor) {
long a = Math.abs((long)dividend);
// ref : http://blog.csdn.net/kenden23/article/details/16986763
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
long b = Math.abs((long)divisor);
int ret = 0;
// 这里必须是= 因为相等时也可以减
while (a >= b) {
// 判断条件是 >=
for (long deduce = b, cnt = 1; a >= deduce; deduce <<= 1, cnt <<= 1) {
a -= deduce;
ret += cnt;
}
}
// 获取符号位。根据除数跟被除数的关系来定
return (dividend > 0) ^ (divisor > 0) ? -ret: ret;
}
}
注意:
1. C,java中的右移运算,是带符号位的,叫算术右移http://www.cppblog.com/tx7do/archive/2006/10/19/13867.html
2015.1.3 redo:
Leetcode又加强了一大堆边界条件运算,所以我们代码也要更改:
1. 返回值的时候,判断是不是越界,越界返回最大值。
例子:
Input: -2147483648, -1
Expected: 2147483647
public int divide(int dividend, int divisor) {
if (divisor == 0) {
return Integer.MAX_VALUE;
}
// Note: 在这里必须先取long再abs,否则int的最小值abs后也是原值
long dividendTmp = Math.abs((long)dividend);
long divisorTmp = Math.abs((long)divisor);
// bug 3: ret should use Long to avoid overflow.
long ret = 0;
// bug 2: should use dividentTmp > divisor as the while judge.
while (dividendTmp >= divisorTmp) {
// bug 1: should use Long for tmp.
long tmp = divisorTmp;
int rst = 1;
while(tmp <= dividendTmp) {
// bug 3: the two statement should inside the while LOOP.
ret += rst;
dividendTmp -= tmp;
tmp <<= 1;
rst <<= 1;
}
}
// bug 4: out of range:
/*
Input: -2147483648, -1
Output: -2147483648
Expected: 2147483647
*/
//ret = ((dividend > 0) ^ (divisor > 0)) ? -ret: ret;
ret = ((((dividend ^ divisor) >> 31) & 1) == 1) ? -ret: ret;
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
} else {
return (int)ret;
}
}
简化一点:
public int divide(int dividend, int divisor) {
long a = Math.abs((long)dividend);
long b = Math.abs((long)divisor);
long ret = 0;
while (a >= b) {
for (long tmp = b, cnt = 1; a >= tmp; tmp <<= 1, cnt <<= 1) {
ret += cnt;
a -= tmp;
}
}
ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret;
if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return (int)ret;
}
GitHub Code:
Ref: http://blog.csdn.net/fightforyourdream/article/details/16899675
LeetCode: Divide Two Integers 解题报告的更多相关文章
- LeetCode 1 Two Sum 解题报告
LeetCode 1 Two Sum 解题报告 偶然间听见leetcode这个平台,这里面题量也不是很多200多题,打算平时有空在研究生期间就刷完,跟跟多的练习算法的人进行交流思想,一定的ACM算法积 ...
- 【LeetCode】Largest Number 解题报告
[LeetCode]Largest Number 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/largest-number/# ...
- 【LeetCode】Permutations II 解题报告
[题目] Given a collection of numbers that might contain duplicates, return all possible unique permuta ...
- 【LeetCode】Island Perimeter 解题报告
[LeetCode]Island Perimeter 解题报告 [LeetCode] https://leetcode.com/problems/island-perimeter/ Total Acc ...
- 【LeetCode】01 Matrix 解题报告
[LeetCode]01 Matrix 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/01-matrix/#/descripti ...
- 【LeetCode】Gas Station 解题报告
[LeetCode]Gas Station 解题报告 标签(空格分隔): LeetCode 题目地址:https://leetcode.com/problems/gas-station/#/descr ...
- 【LeetCode】120. Triangle 解题报告(Python)
[LeetCode]120. Triangle 解题报告(Python) 作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址htt ...
- [LeetCode] Divide Two Integers 两数相除
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- LeetCode: Unique Paths II 解题报告
Unique Paths II Total Accepted: 31019 Total Submissions: 110866My Submissions Question Solution Fol ...
随机推荐
- STL之lambda表达式
一.简介 我们可以向一个算法传递任何类别的可调用对象.对于一个对象或一个表达式,如果可以对其使用调用运算符,则称它为可调用的.即,如果e是一个可调用的表达式,则我们可以编写代码e(args),其中ar ...
- [Done]mysql in (#{list}) 只能查询/删除第一条的问题
数据如下(注意age是int类型): sql如下(注意是#不是$): java代码: Mybatis日志(只返回一笔记录): 直接在mysql中执行(age是int类型,注意参数带引号,确认jdbc是 ...
- def函数之另类用法
#python 27 #xiaodeng def list_opts(): return [ ('name', 'xiaodeng'), ('age', 28), ('), ('where', 'en ...
- linux脚本加密shc
linxu的shell脚本看下源码,都能明白含义.加密也是很关键的 01.安装shc加密 http://www.datsi.fi.upm.es/~frosal/sources/ ###下载源码 百 ...
- JavaScript-实现滚动条
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- PHP API中,MYSQL与MYSQLI的持久连接区别
转载自:http://www.cnxct.com/some-differences-between-mysql-and-mysqli-of-persistent-connection/ 很久很久以前, ...
- Linux下发布javaWeb项目,配置环境变量,tomcat,和安装mysql数据库
如果不懂,可以联系微博本人:QQ:3111901846 (原创) 1.配置java中jdk 注意一切操作,都是在root这个目录下进行的,不要选择其他目录,不然会出现一些小问题的 第一步: 你需要一个 ...
- Android 监听 Android中监听系统网络连接打开或者关闭的实现代码
本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...
- 转 MySQL中的共享锁与排他锁
原文链接在MySQL中的行级锁,表级锁,页级锁中介绍过,行级锁是Mysql中锁定粒度最细的一种锁,行级锁能大大减少数据库操作的冲突.行级锁分为共享锁和排他锁两种,本文将详细介绍共享锁及排他锁的概念.使 ...
- django 创建数据库表 命令
一旦你觉得你的模型可能有问题,运行 python manage.py validate . 它可以帮助你捕获一些常见的模型定义错误. 模型确认没问题了,运行下面的命令来生成 CREATE TABLE ...