leetcode 29.两数相除

题目描述

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

示例 1:

输入: dividend = 10, divisor = 3
输出: 3

示例 2:

输入: dividend = 7, divisor = -3
输出: -2

说明:

  • 被除数和除数均为 32 位有符号整数。
  • 除数不为 0。
  • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

解题思路

两数两除,不能使用乘法、除法和mod运算符,那么一个很简单的思路就出来了,就是不断的用被除数不断的减去除数,直到被除数小于除数的时候,结束迭代,但是如果这样做的话,势必会超时,举个例子 dividend=INT_MIN, divisor=1,如果这样迭代的话,就要花费很长的时间。
在计算机里,位运算的执行效率是非常高的,一个数字左移一位相当于除以2,右移一位相当于乘以2,那么就可以采用这样的方法来减少迭代次数。意思是,每一次相减都让除数的值翻倍,当然累加次数也要翻倍,直到dividend小于divisor的时候停止。举几个简单的例子

例子一: dividend = 10, divisor = 1

  • 采用保留求解,就是10不停的减去1,那么需要循环十次。

  • 采用位移的方法 ,是怎么操作的呢,看下面的表格,

    1. 首先建立一个临时的变量temp=divisor,让dividend去减temp,count记一,这时候发现dividend大于等于temp,那么dividor翻倍,count也翻倍,然后发现dividend仍然大于等于temp,temp继续翻倍,那么count也应该在原来的基础上翻倍(记录被减了多少次);
    2. 再继续判断temp继续翻倍的话,dividend就小于temp了,这时候dividend=2,让此时的dividend去和divisor比较,发现dividend大于等于divisor,那么就继续把temp=divisor,循环上面的操作

    上面写的步骤只是为了好理解,其实就是 dividend = 8 + 2 + 余数 = 23*1 + 21*1 + 余数

    dividend temp count
    10 >= 2 1 1
    10 >= 4 2 2
    10 >= 8 4 4
    10 < 16,此时10减去8,并与divisor比较 8 8 此时res+8
    2 >= 2 1 1
    2 < 4 此时 2减去2,并与divisor比较 2 2 此时res+2
    合计 res 10

例子二:dividend = 123, divisor = 3;

123 = 25*3 + 23*3 + 3

dividend temp count
123 >= 6 3 1
123 >= 12 6 2
123 >= 24 12 4
123 >= 48 24 8
123 >= 96 48 16
123 < 192 此时 123减去96,并与divisor比较 96 32 此时res+32
27 >= 6 3 1
27 >= 12 6 2
27 >= 24 12 4
27 <= 48 此时27减去24,并与divisor比较 24 8 此时res+8
3 < 6 此时 3减去3,并与divisor比较 3 1 此时res+1
合计 res 41

通过上面的例子就可以知道,通过位移的方法可以大大加上迭代的次数,提高运算效率,具体代码如下

class Solution {public:int divide(int dividend, int divisor) {if(divisor == 0 || dividend == 0){      // 被除数为零或者除数为零直接返回零return 0;}if(divisor == 1){     // 如果除数是1,就不需要额外的操作,直接返回被除数本身return dividend;}// 当被除数为INT_MIN, 除数是-1时需要特别注意,会出现溢出的情况,因为int范围是-2147483648~2147483647,相除的结果就是2147483648,当然是溢出;所以这里做一个特殊处理if(divisor == -1 && dividend == INT_MIN){  return INT_MAX;}bool sign = (dividend > 0)^(divisor > 0);  // 通过异或, 判断是不是异号long a = dividend, b = divisor;         // 这里把两个数转成long类型,并取绝对值,取绝对值是为了好运算,如果是不采用绝对值,就要分四种情况(--,++,+-,-+)来讨论反而更复杂a = abs(a);b = abs(b);int res = 0;while(a >= b){  // 如果a<b,那么循环终止int count = 1;long temp = b;while(a >= (temp<<1)){  // 不断的采用位移操作,尽可能减去最大的除数的倍数temp = temp << 1;count = count << 1;}a -= temp;res += count;} // 通过sign判断是否异号,并在结果res上添加对应符号return sign ? -res : res;}
};

欢迎大家关注我的个人公众号,同样的也是和该博客账号一样,专注分享技术问题,我们一起学习进步

leetcode 29.两数相除相关推荐

  1. Java实现 LeetCode 29 两数相除

    29. 两数相除 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商 ...

  2. leetcode 29 两数相除 C语言

    题目 leetcode 29 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 diviso ...

  3. LeetCode 29. 两数相除(位运算)

    1. 题目 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示 ...

  4. leetcode —— 29. 两数相除

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整数除法的结果 ...

  5. [LeetCode]29 两数相除和一个小坑点

    给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符.返回被除数 dividend 除以除数 divisor 得到的商.示例 1:输入: ...

  6. leetcode 29.两数相除(python3)68ms

    题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 整 ...

  7. LeetCode 29 两数相除

    https://leetcode-cn.com/problems/divide-two-integers/submissions/ 解决方案 class Solution {public int di ...

  8. LeetCode高频题29. 两数相除:不用加减乘除号,求加法,减法,乘法,除法

    LeetCode高频题29. 两数相除 提示:本题是系列LeetCode的150道高频题,你未来遇到的互联网大厂的笔试和面试考题,基本都是从这上面改编而来的题目 互联网大厂们在公司养了一大批ACM竞赛 ...

  9. LeetCode-中等-29. 两数相除

    LeetCode-中等-29. 两数相除 题目 引用自:LeetCode-中等-29. 两数相除(如有侵权联系删除) 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不 ...

最新文章

  1. 如何用staruml画包图_StarUML的9种图
  2. Eclipse + Spring boot +mybatis + mysql(后续)
  3. Exchange 2010 运维技巧一
  4. 独家 | 分答深度报告:42天估值1亿美金,分答如何获取百万付费用户?
  5. Mac连接远程Linux管理文件(samba)
  6. UI行业发展预测 系列规划的调整
  7. APP论坛社区软件源码 APP封装
  8. sklearn自定义svm核函数(外部和内部定义)
  9. 使用xUnit测试验证属性
  10. 基于OctTree的快速最近颜色搜索
  11. 面试题 04.08. 首个共同祖先
  12. Android开发笔记(一百七十七)借助FileProvider安装应用
  13. 微软软件基地落户广州
  14. 我有一百种方法让你的Excel连上数据库
  15. w7电脑蓝屏怎么解决_为你解答win7电脑蓝屏怎么办
  16. 前端职业规划 - 写给年轻的前端韭菜们
  17. AndroidStudio 跑马灯效果不自动滚动的原因
  18. apache-tomcat-10.0.18配置
  19. .Net Core 编码规范
  20. 获取搜狗音乐的真实路径方法

热门文章

  1. 底价团购潮 proscenic扫地机器人京东热卖
  2. 如何用计算机处理图片,修改图片用什么软件 小白必看的图片处理技巧_电脑故障...
  3. mysql2008百度云_SQLServer数据库之SQL Server 2008R2 企业版 百度云下载地址
  4. 华为OD机试 - 相对开音节(Java JS Python)
  5. 向凡客提议:建立ERP 深挖服装市场价值
  6. dumpsys meminfo分析
  7. u盘不能从计算机辅助东西卷问题,U盘文件无法复制的原因分析及解决方法(图文详情)...
  8. 留学目的地之马里兰州
  9. 【智能金融】乐信史红哲:成为分期电商第一股背后的技术战略
  10. 基本组网-(适用场景:一般家庭网络、微型企业网络、20人以内)、基础知识、设备知识、运营商选择、设备选择、设备配置