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),会超时。

  1. public class Solution {
  2. public int divide(int dividend, int divisor) {
  3.  
  4. boolean positive = true;
  5. if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))
  6. positive = false;
  7. long did=dividend>=0?(long)dividend:-(long)dividend;
  8. long dis=divisor>=0?(long)divisor:-(long)divisor;
  9.  
  10. long quotients = positiveDivide(did, dis);
  11. if (!positive)
  12. return (int)-quotients;
  13. return (int)quotients;
  14. }
  15.  
  16. public long positiveDivide(long did, long dis) {
  17. long[] array = new long[32];
  18. long sum = 0;
  19. int i = 1;
  20. long quotients = 0;
  21. if(dis==1) return did;//为了避免-did=Integer.MIN_VALUE,而dis=1。出现故障
  22. for (array[0]=dis; i < 32 && array[i - 1] <= did; i++)
  23. array[i] = array[i - 1] << 1;
  24.  
  25. for (i = i - 2; i >= 0; i--) {
  26. if (sum <= did - array[i]) {
  27. sum += array[i];
  28. quotients += 1 << i;
  29. }
  30. }
  31. return quotients;
  32. }
  33. }

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

  1. public class Solution {
  2. public int divide(int dividend, int divisor) {
  3.  
  4. boolean positive = true;
  5. if((dividend>0&&divisor<0)||(dividend<0&&divisor>0))
  6. positive = false;
  7. long did=dividend>=0?
  8.  
  9. (long)dividend:-(long)dividend;
  10. long dis=divisor>=0?(long)divisor:-(long)divisor;
  11.  
  12. long quotients = positiveDivide(did, dis);
  13. if (!positive)
  14. return (int)-quotients;
  15. return (int)quotients;
  16. }
  17.  
  18. public long positiveDivide(long did, long dis) {
  19. long sum = 0;
  20. long quotients = 0;
  21. if(dis==1) return did;//为了避免-did=Integer.MIN_VALUE,而dis=1。出现故障
  22.  
  23. //sum从divisor*2^31的開始加起,不能加则试试加上divisor*2^30。
  24. //若不能则试试divisor*2^29,依此类推
  25. for (int i = 31; i >= 0; i--) {
  26. long temp=dis<<i;//该式为divisor*2^a
  27.  
  28. //sum<=dividend则说明dividend大于divisor*(2^m+...+2^i),m最大为31
  29. if (sum <= did - temp) {
  30. sum += temp;
  31. quotients += 1 << i;//2^i
  32. }
  33. }
  34. return quotients;
  35. }
  36. }

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. JavaScript入门笔记

    第一章 JavaScript语法 1.1 初识JavaScript 1.3 数据类型 1.4 string和boolean类型 1.5 算数操作符 第二章 JavaScript流程控制语句 2.1 循 ...

  2. drupal 8 ——自定义权限

    在项目开发里面,我遇到了这么一个需求,就是对于node的title字段,编辑内容的角色不允许对title进行编辑.title字段是创建内容类型时自动生成的字段,不能在drupal8后台直接配置权限,所 ...

  3. 【PostgreSQL-9.6.3】分区表

    PostgreSQL中的分区表是通过表继承来实现的(表继承博客http://www.cnblogs.com/NextAction/p/7366607.html).创建分区表的步骤如下: (1)创建“父 ...

  4. JS——高级各行换色

    1.获取tbody下的子元素 2.注册鼠标覆盖事件时存储当时的背景颜色,注册鼠标离开事件时把存储的颜色赋值注册事件对象 <!DOCTYPE html> <html> <h ...

  5. java攻城狮之路--复习xml&dom_pull编程

    xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后     把复选框勾去即可. ...

  6. (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例

    http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...

  7. PHP 之ftp客户端类封装实现

    <?php /** * Class FtpClient */ class FtpClient { private $host = '';//远程服务器地址 private $user = ''; ...

  8. Eclipse安装和使用TFS

    第一步下载Tfs插件 去微软官网下载https://www.microsoft.com/en-us/download/details.aspx?id=4240 点击 选择下载 随便放置到一个本地或者服 ...

  9. python--(十五步代码学会进程)

    python--(十五步代码学会进程) 一.进程的创建 import time import os #os.getpid() 获取自己进程的id号 #os.getppid() 获取自己进程的父进程id ...

  10. vue 根据网站路由判断页面主题色

    需求: 不同品牌对应不同版本配色 做法: 根据域名带的参数判断进入哪个品牌,对应哪个版本 在main.js中 import Vue from 'vue' import App from './App' ...