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

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

示例 1:

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

示例 2:

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

说明:

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

解题思路

已给非常容易想到的解题思路就是先分析我们最后的数字是正数还是负数,我们将其全部转化为正数处理,通过divisor的不断叠加,直到累加和超过dividend,我们记录累加次数。最后根据结果是不是负数,加上负号即可,同时我们要考虑好边界问题。

class Solution:def divide(self, dividend, divisor):""":type dividend: int:type divisor: int:rtype: int"""res, count, divd, divs = -1, 0, None, Nonepos = False if (dividend < 0) ^ (divisor < 0) else Truedivd, divs = abs(dividend), abs(divisor)if divd < divs:return 0mod = 2**31while count <= divd:count += divsres += 1if res == mod:breakif pos and res == mod:res -= 1return res if pos else -res

但是dividend很大divisor很小的时候上述做法就超时了,我们只有尝试新的方法。我们可能设置一种增量式的方案,我们使每次增加的divisor扩大两倍。我们的算法思路如下,对于例1

3 * 1 < 10
3 * 2 < 10
3 * 4 > 10

所以我们现将2加入到结果中,然后计算我们剩余要填充的值10-2*3 = 4

3 * 1 < 4
3 * 2 > 4

所以我们再将1加入到结果中,然后计算我们剩余要填充的值4 - 3 = 1。我们此时发现剩余的值1小于我们的divisor=3,所以我们知道我们的结果就是1+2=3

对于正负数的处理我们还是按照之前的做法。代码如下

class Solution:def divide(self, dividend, divisor):""":type dividend: int:type divisor: int:rtype: int"""res, divd, divs = 0, None, Nonepos = False if (dividend < 0) ^ (divisor < 0) else Truedivd, divs = abs(dividend), abs(divisor)if divd < divs:return 0mod = 2**31while divs <= divd:mul, tmp = 1, divswhile (tmp << 1) <= divd:mul <<= 1tmp <<= 1res += muldivd -= tmpif res == mod:breakif pos and res == mod:res -= 1return res if pos else -res

这种算法思路非常重要,在 Leetcode 50:Pow(x, n)(超详细的解法!!!)问题中,我们会用到同样的算法思路。

对于CPP我们需要注意一个细节,我们使用long long类型的话,我们需要使用labs(),而不是abs()

我将该问题的其他语言版本添加到了我的GitHub Leetcode

如有问题,希望大家指出!!!

Leetcode 29:两数相除(超详细的解法!!!)相关推荐

  1. leetcode 29.两数相除

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

  2. Java实现 LeetCode 29 两数相除

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

  3. leetcode 29 两数相除 C语言

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

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

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

  5. leetcode —— 29. 两数相除

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

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

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

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

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

  8. LeetCode 29 两数相除

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

  9. Leetcode 1419:数青蛙(超详细的解法!!!)

    给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合.由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合 ...

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

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

最新文章

  1. Alibaba Dubbo框架同步调用原理分析-1
  2. 字符串格式化漏洞修改GOT表一例
  3. Date类(日期时间类)219
  4. 现代软件工程 结对编程 (II) 电梯调度 算法和测试框架
  5. pandas滑动窗口防止nan出现
  6. 【java】理解和运用Java中的Lambda
  7. vfp:数据库中表间关系的参照完整性
  8. java 拉钩技术_拉钩JAVA高薪训练营笔记汇总
  9. String类中重写Object中的equals方法源码解析
  10. markdown的标题设置自动添加序号
  11. 麻雀如何变凤凰 by 网络雄猫
  12. java 重写equals的要点_重写equals 方法的注意事项
  13. 跨境电商选品:如何判断产品市场容量?
  14. Chatbot(五)
  15. C/C++面试题-2 之2/2
  16. OTDR光时域反射仪 知识总结
  17. PB中执行动态SQL语句(温故知新)
  18. Windows环境下filebeat配置发送日志至Elasticsearch
  19. 前端需要了解的颜色模型,RGB、HSL和HSV
  20. 今天思考一个问题 --- 自己的强项是什么??

热门文章

  1. 数据完整性验证之数字摘要算法
  2. ThemeBuilder自制主题工具详细使用教程
  3. 王冉:麦道夫骗局告诉我们的10件事
  4. ArcGIS10.2详细安装教程(附安装包获取方式)
  5. 安卓sdk,模拟器使用命令行下载安装启动
  6. 百度地图 - Android初步集成
  7. 【caffe】Layer解读之:Flatten
  8. 倾听程序员的心声真的很重要
  9. 商品添加购物车,传递参数到页面,页面跳转到购物车页面
  10. 【无标题】像灵遁者那样写作,从观察细微开始