乘风破浪:LeetCode真题_029_Divide Two Integers

一、前言

    两个整数相除,不能使用乘法除法和取余运算。那么就只能想想移位运算和加减法运算了。

二、Divide Two Integers

2.1 问题

2.2 分析与解决

     通过分析,我们可以想到,如果使用加法,一次次的减下去,每减一次就加一,直到最后的减数小于除数。但是这样的时间复杂度将会是非常的大,比如100000,3这两个数,非常的耗时,那么如何加快运算呢,我们想到了移位运算。

public class Solution {
/**
* 题目大意:
* 不使用除法,乘法和取余,求两个整数的相除的结果,如果有溢出就返回最大的整数
*
* 解题思路:
* 任何一个整数可以表示成以2的幂为底的一组基的线性组合,
* 即num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n。
* 基于以上这个公式以及左移一位相当于乘以2,我们先让除
* 数左移直到大于被除数之前得到一个最大的基。然后接下来我们
* 每次尝试减去这个基,如果可以则结果增加加2^k,然后基继续右
* 移迭代,直到基为0为止。因为这个方法的迭代次数是按2的幂知
* 道超过结果,所以时间复杂度为O(log(n))。
*
*/
public int divide(int dividend, int divisor) {
// 相除时溢出处理
if (divisor == 0 || dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
} // 求符号位,异或运算
int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1; // 求绝对值,为防止溢出使用long
long dvd = Math.abs((long) dividend);
long dvs = Math.abs((long) divisor); // 记录结果
int result = 0; // 被除数大于除数
while (dvd >= dvs) {
// 记录除数
long tmp = dvs;
// 记录商的大小
long mul = 1; while (dvd >= (tmp << 1)) {
tmp <<= 1;
mul <<= 1;
} // 减去最接近dvd的dvs的指数倍的值(值为tmp)
dvd -= tmp; // 修正结果
result += mul;
} return result * sign;
}
}

三、总结

当我们没有办法的时候不妨想想移位操作,这样能极大的提升我们的操作速度和效率。

乘风破浪:LeetCode真题_029_Divide Two Integers的更多相关文章

  1. 乘风破浪:LeetCode真题_041_First Missing Positive

    乘风破浪:LeetCode真题_041_First Missing Positive 一.前言 这次的题目之所以说是难,其实还是在于对于某些空间和时间的限制. 二.First Missing Posi ...

  2. 乘风破浪:LeetCode真题_040_Combination Sum II

    乘风破浪:LeetCode真题_040_Combination Sum II 一.前言 这次和上次的区别是元素不能重复使用了,这也简单,每一次去掉使用过的元素即可. 二.Combination Sum ...

  3. 乘风破浪:LeetCode真题_039_Combination Sum

    乘风破浪:LeetCode真题_039_Combination Sum 一.前言     这一道题又是集合上面的问题,可以重复使用数字,来求得几个数之和等于目标. 二.Combination Sum ...

  4. 乘风破浪:LeetCode真题_038_Count and Say

    乘风破浪:LeetCode真题_038_Count and Say 一.前言     这一道题目,很类似于小学的问题,但是如果硬是要将输入和结果产生数值上的联系就会产生混乱了,因此我们要打破思维定势. ...

  5. 乘风破浪:LeetCode真题_037_Sudoku Solver

    乘风破浪:LeetCode真题_037_Sudoku Solver 一.前言 这次我们对于上次的模型做一个扩展并求解. 二.Sudoku Solver 2.1 问题 2.2 分析与解决     这道题 ...

  6. 乘风破浪:LeetCode真题_036_Valid Sudoku

    乘风破浪:LeetCode真题_036_Valid Sudoku 一.前言 有的时候对于一些基础知识的掌握,对我们是至关重要的,比如ASCII重要字符的表示,比如一些基本类型的长度. 二.Valid ...

  7. 乘风破浪:LeetCode真题_035_Search Insert Position

    乘风破浪:LeetCode真题_035_Search Insert Position 一.前言 这次的问题比较简单,也没有限制时间复杂度,但是要注意一些细节上的问题. 二.Search Insert ...

  8. 乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array

    乘风破浪:LeetCode真题_034_Find First and Last Position of Element in Sorted Array 一.前言 这次我们还是要改造二分搜索,但是想法却 ...

  9. 乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array

    乘风破浪:LeetCode真题_033_Search in Rotated Sorted Array 一.前言     将传统的问题进行一些稍微的变形,这个时候我们可能无所适从了,因此还是实践出真知, ...

随机推荐

  1. .2-浅析webpack源码之打包后文件

    先不进源码,分析一下打包后的文件,来一张图: 首先创建两个JS文件,内容如下: // config.js module.exports = { entry: './input.js', output: ...

  2. Redis-发布与订阅

    发布与订阅(pub/sub)的特点是订阅者负责订阅频道发送者负责向频道发送二进制字符串消息.每当有消息发送至给定频道时,频道的所有订阅者都会收到消息 (发布和订阅命令) SUBSCRIBE : SUB ...

  3. .NET Core类库中读取配置文件

    最近在开发基于.NET Core的NuGet包,遇到一个问题:.NET Core中已经没有ConfigurationManager类,在类库中无法像.NET Framework那样读取App.conf ...

  4. 数据结构与算法--最小生成树之Kruskal算法

    数据结构与算法--最小生成树之Kruskal算法 上一节介绍了Prim算法,接着来看Kruskal算法. 我们知道Prim算法是从某个顶点开始,从现有树周围的所有邻边中选出权值最小的那条加入到MST中 ...

  5. 【JavaFx教程】第二部分:Model 和 TableView

    第二部分的主题 创建一个 模型 类. 在 ObservableList 使用模型类. 使用 Controllers 在 TableView 上显示数据. 创建 模型 类. 我们需要一个模型类来保存联系 ...

  6. SpringCloud微服务架构第三篇

    原文链接:https://www.javazhiyin.com/5130.html 微服务开发专栏:https://www.javazhiyin.com/category/springcloud Ri ...

  7. css3的calc()属性

    1.calc()是css3的一个新增的功能,用来指定元素的长度,你可以使用calc()给元素的border.margin.pading.font-size和width等属性动态的设置值. 2.calc ...

  8. C#加解密算法

    先附上源码 加密解密算法目前已经应用到我们生活中的各个方面 加密用于达到以下目的: 保密性:帮助保护用户的标识或数据不被读取. 数据完整性:帮助保护数据不被更改. 身份验证:确保数据发自特定的一方. ...

  9. ArcGIS JavaScript API 4.x中热度图渲染的使用注意事项

    要使用ArcGIS JavaScript API 4.x的热度图渲染器来渲染要素图层,需要注意几点前提条件: 1.需要使用ArcGIS Server 10.6.1或更高版本发布GIS服务. 2.只支持 ...

  10. Linux 性能监控之CPU&内存&I/O监控Shell脚本2

    Linux 性能监控之CPU&内存&I/O监控Shell脚本2   by:授客 QQ:1033553122 思路: 捕获数据->停止捕获数据->提取数据 备注:一些命令的输 ...