LeetCode 28 Divide Two Integers
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的更多相关文章
- [LeetCode] 29. Divide Two Integers 两数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- 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 (middle)☆
Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...
- Java [leetcode 29]Divide Two Integers
题目描述: Divide two integers without using multiplication, division and mod operator. If it is overflow ...
- [leetcode]29. Divide Two Integers两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, divisio ...
- [LeetCode] 29. Divide Two Integers(不使用乘除取模,求两数相除) ☆☆☆
转载:https://blog.csdn.net/Lynn_Baby/article/details/80624180 Given two integers dividend and divisor, ...
- [leetcode]29. Divide Two Integers 两整数相除
Given two integers dividend and divisor, divide two integers without using multiplication, division ...
- [LeetCode] 29. 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. class Solution { public ...
随机推荐
- JavaScript入门笔记
第一章 JavaScript语法 1.1 初识JavaScript 1.3 数据类型 1.4 string和boolean类型 1.5 算数操作符 第二章 JavaScript流程控制语句 2.1 循 ...
- drupal 8 ——自定义权限
在项目开发里面,我遇到了这么一个需求,就是对于node的title字段,编辑内容的角色不允许对title进行编辑.title字段是创建内容类型时自动生成的字段,不能在drupal8后台直接配置权限,所 ...
- 【PostgreSQL-9.6.3】分区表
PostgreSQL中的分区表是通过表继承来实现的(表继承博客http://www.cnblogs.com/NextAction/p/7366607.html).创建分区表的步骤如下: (1)创建“父 ...
- JS——高级各行换色
1.获取tbody下的子元素 2.注册鼠标覆盖事件时存储当时的背景颜色,注册鼠标离开事件时把存储的颜色赋值注册事件对象 <!DOCTYPE html> <html> <h ...
- java攻城狮之路--复习xml&dom_pull编程
xml&dom_pull编程: 1.去掉欢迎弹窗界面:在window项的preferences选项中输入“configuration center” 找到这一项然后 把复选框勾去即可. ...
- (转)Java任务调度框架Quartz入门教程指南(四)Quartz任务调度框架之触发器精讲SimpleTrigger和CronTrigger、最详细的Cron表达式范例
http://blog.csdn.net/zixiao217/article/details/53075009 Quartz的主要接口类是Schedule.Job.Trigger,而触发器Trigge ...
- PHP 之ftp客户端类封装实现
<?php /** * Class FtpClient */ class FtpClient { private $host = '';//远程服务器地址 private $user = ''; ...
- Eclipse安装和使用TFS
第一步下载Tfs插件 去微软官网下载https://www.microsoft.com/en-us/download/details.aspx?id=4240 点击 选择下载 随便放置到一个本地或者服 ...
- python--(十五步代码学会进程)
python--(十五步代码学会进程) 一.进程的创建 import time import os #os.getpid() 获取自己进程的id号 #os.getppid() 获取自己进程的父进程id ...
- vue 根据网站路由判断页面主题色
需求: 不同品牌对应不同版本配色 做法: 根据域名带的参数判断进入哪个品牌,对应哪个版本 在main.js中 import Vue from 'vue' import App from './App' ...