Divide two integers without using multiplication, division and mod operator.

思路:1.先将被除数和除数转化为long的非负数,注意一定要为long。由于Integer.MIN_VALUE的绝对值超出了Integer的范围。

2.常理:不论什么正整数num都能够表示为num=2^a+2^b+2^c+...+2^n。故能够採用2^a+2^b+2^c+...+2^n来表示商,即dividend=divisor*(2^a+2^b+2^c+...+2^n),(a,b,c,....m互不相等。且最大为31,最小为0)。

而商的最大值为Integer.MIN_VALUE的绝对值。商最多有32个2的指数次相加。故时间复杂度为常数。

3.divisor*2^a用计算机表示为divisor<<a;

注意:若每次仅仅加一个divisor。则面对Integer.MAX_VALUE除以一个非常小的常数(eg:1。2。3),会超时。

public class Solution {
public int divide(int dividend, int divisor) { boolean positive = true;
if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))
positive = false;
long did=dividend>=0?(long)dividend:-(long)dividend;
long dis=divisor>=0?(long)divisor:-(long)divisor; long quotients = positiveDivide(did, dis);
if (!positive)
return (int)-quotients;
return (int)quotients;
} public long positiveDivide(long did, long dis) {
long[] array = new long[32];
long sum = 0;
int i = 1;
long quotients = 0;
if(dis==1) return did;//为了避免-did=Integer.MIN_VALUE,而dis=1。出现故障
for (array[0]=dis; i < 32 && array[i - 1] <= did; i++)
array[i] = array[i - 1] << 1; for (i = i - 2; i >= 0; i--) {
if (sum <= did - array[i]) {
sum += array[i];
quotients += 1 << i;
}
}
return quotients;
}
}

优化版,减小内存的消耗。不申请动态数组

public class Solution {
public int divide(int dividend, int divisor) { boolean positive = true;
if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))
positive = false;
long did=dividend>=0? (long)dividend:-(long)dividend;
long dis=divisor>=0?(long)divisor:-(long)divisor; long quotients = positiveDivide(did, dis);
if (!positive)
return (int)-quotients;
return (int)quotients;
} public long positiveDivide(long did, long dis) {
long sum = 0;
long quotients = 0;
if(dis==1) return did;//为了避免-did=Integer.MIN_VALUE,而dis=1。出现故障 //sum从divisor*2^31的開始加起,不能加则试试加上divisor*2^30。
//若不能则试试divisor*2^29,依此类推
for (int i = 31; i >= 0; i--) {
long temp=dis<<i;//该式为divisor*2^a //sum<=dividend则说明dividend大于divisor*(2^m+...+2^i),m最大为31
if (sum <= did - temp) {
sum += temp;
quotients += 1 << i;//2^i
}
}
return quotients;
}
}

LeetCode 28 Divide Two Integers的更多相关文章

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

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  2. Java for LeetCode 029 Divide Two Integers

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

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

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

  4. Java [leetcode 29]Divide Two Integers

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

  5. [leetcode]29. Divide Two Integers两整数相除

      Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...

  6. [LeetCode] 29. Divide Two Integers(不使用乘除取模,求两数相除) ☆☆☆

    转载:https://blog.csdn.net/Lynn_Baby/article/details/80624180 Given two integers dividend and divisor, ...

  7. [leetcode]29. Divide Two Integers 两整数相除

    Given two integers dividend and divisor, divide two integers without using multiplication, division ...

  8. [LeetCode] 29. Divide Two Integers ☆☆

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

  9. 【Leetcode】Divide Two Integers

    Divide two integers without using multiplication, division and mod operator. class Solution { public ...

随机推荐

  1. python框架之虚拟环境的配置

    在开发过程中,往往同一台电脑要开发不同的项目,不同的项目可能需要不同版本的包,为了解决这个问题就引出了虚拟环境. 配置虚拟环境: 1.安装虚拟环境: sudo pip3 install virtual ...

  2. canvas烟花锦集

    canvas可以实现不同动画效果,本文主要记录几种不同节日烟花效果实现. 实现一 效果地址 html <canvas id="canvas"></canvas&g ...

  3. Java引用jar的优化

    一般java的类文件开头都是各种引用: 如 上图的引用可以写成

  4. html5——3D案例(立方体)

    立方体:父盒子规定了3d呈现属性,立方体做旋转运动 移动顺序:1.每个盒子都先移动100px,然后再做相应的旋转  2.只有这样立方体的几何中心点与父盒子的几何中心点是一样的 <!DOCTYPE ...

  5. mysqlconnector将EXCEL表数据导入数据库

    测试excel和脚本放在同一个目录 测试excel和脚本放在同一个目录 #!/usr/bin/env python #coding=utf-8 import xlrd import mysql.con ...

  6. idea中配置xml不自动提示解决方案

    1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...

  7. Oracle,sqlserver,mySQl的区别和联系:

    1.日期处理方式 2.对保留字和关键字的处理方式: Oracle,sqlserver,mySQl的保留字不可以用作列字段,关键字可以,但他们对关键字的处理方式又不同: Oracle:关键字作为列时:用 ...

  8. vue和iview中native点击事件修饰

    在父组件中给子组件绑定一个原生的事件,就将子组件变成了普通的HTML标签,不加'. native'事件是无法触 在vue中使用iview的dropdownMenu 上单纯的@click也不生效,要写成 ...

  9. 一、Scrapy入门教程

    本文转载自以下链接:https://scrapy-chs.readthedocs.io/zh_CN/latest/intro/tutorial.html 在本篇教程中,我们假定您已经安装好Scrapy ...

  10. TensorFlow 学习笔记(2)----placeholder的使用

    此系列将会每日持续更新,欢迎关注 在TensorFlow中输入值的方式是通过placeholder来实现 例如:做两个数的乘法时,是先准备好两个place, 再将输出值定义成两数的乘法 最后利用ses ...