两数相除

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

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

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

示例说明请见LeetCode官网。

来源:力扣(LeetCode)

链接:https://leetcode-cn.com/problems/divide-two-integers/

著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:二分查找

首先,判断几种特殊的情况; 然后用二分查找法找到除数。

解法参考的leetcode官网的解法。

  1. public class LeetCode_029 {
  2. /**
  3. * 二分查找
  4. *
  5. * @param dividend 被除数
  6. * @param divisor 除数
  7. * @return
  8. */
  9. public static int divide(int dividend, int divisor) {
  10. if (dividend == Integer.MIN_VALUE) {
  11. if (divisor == 1) {
  12. // 当被除数为最小值,除数为1时,直接返回最小值
  13. return Integer.MIN_VALUE;
  14. }
  15. if (divisor == -1) {
  16. // 当被除数为最小值,除数为-1时,相除会溢出,直接返回最大值
  17. return Integer.MAX_VALUE;
  18. }
  19. }
  20. if (dividend == 0) {
  21. // 如果被除数为0,除以任何数都为0,直接返回0
  22. return 0;
  23. }
  24. if (divisor == Integer.MIN_VALUE) {
  25. if (dividend == Integer.MIN_VALUE) {
  26. // 如果被除数和除数都是最小值,返回1
  27. return 1;
  28. } else {
  29. // 当除数是最小值,被除数不是最小值时,相除的结果肯定是在-1和1之间,返回0
  30. return 0;
  31. }
  32. }
  33. // 将所有的正数取相反数,这样就只需要考虑一种情况
  34. boolean rev = false;
  35. if (dividend > 0) {
  36. dividend = -dividend;
  37. rev = !rev;
  38. }
  39. if (divisor > 0) {
  40. divisor = -divisor;
  41. rev = !rev;
  42. }
  43. int left = 1, right = Integer.MAX_VALUE, ans = 0;
  44. while (left <= right) {
  45. // 注意溢出,并且不能使用除法
  46. int mid = left + ((right - left) >> 1);
  47. boolean check = quickAdd(divisor, mid, dividend);
  48. if (check) {
  49. ans = mid;
  50. // 注意溢出
  51. if (mid == Integer.MAX_VALUE) {
  52. break;
  53. }
  54. left = mid + 1;
  55. } else {
  56. right = mid - 1;
  57. }
  58. }
  59. return rev ? -ans : ans;
  60. }
  61. /**
  62. * 快速乘
  63. *
  64. * @param y
  65. * @param z
  66. * @param x
  67. * @return
  68. */
  69. public static boolean quickAdd(int y, int z, int x) {
  70. // x和y是负数,z是正数
  71. // 需要判断 z*y >= x 是否成立
  72. int result = 0, add = y;
  73. while (z != 0) {
  74. if ((z & 1) != 0) {
  75. // 需要保证 result + add >= x
  76. if (result < x - add) {
  77. return false;
  78. }
  79. result += add;
  80. }
  81. if (z != 1) {
  82. // 需要保证 add + add >= x
  83. if (add < x - add) {
  84. return false;
  85. }
  86. add += add;
  87. }
  88. // 不能使用除法
  89. z >>= 1;
  90. }
  91. return true;
  92. }
  93. public static void main(String[] args) {
  94. System.out.println(Integer.toBinaryString(10));
  95. System.out.println(Integer.toBinaryString(6));
  96. System.out.println(Integer.toBinaryString(3));
  97. System.out.println(divide(10, 3));
  98. }
  99. }

【每日寄语】 以恬淡的模样,经历烟雨尘风的袭击,还原初时的自己。轻拥欢笑,时光深处,温柔静坐。

LeetCode-029-两数相除的更多相关文章

  1. Java实现 LeetCode 29 两数相除

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

  2. Leetcode 29.两数相除 By Python

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

  3. LeetCode 29 - 两数相除 - [位运算]

    题目链接:https://leetcode-cn.com/problems/divide-two-integers/description/ 给定两个整数,被除数 dividend 和除数 divis ...

  4. leetcode 29 两数相除

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

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

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

  6. LeetCode 29——两数相除

    1. 题目 2. 解答 2.1. 方法一 题目要求不能使用乘法.除法和除余运算,但我们可以将除法转移到对数域. \[ \frac{a}{b} = e^{\frac{lna}{lnb}} = e^{ln ...

  7. leetcode 29两数相除

    我理解本题是考察基于加减实现除法,代码如下: class Solution { public: //只用加减号实现除法, //不用加减号实现除法: int divide(int dividend, i ...

  8. [LeetCode] Divide Two Integers 两数相除

    Divide two integers without using multiplication, division and mod operator. If it is overflow, retu ...

  9. python LeetCode 两数相除

    近一个月一直在写业务,空闲时间刷刷leetcode,刷题过程中遇到了一道比较有意思的题目,和大家分享. 题目描述: 给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使 ...

  10. 029 Divide Two Integers 两数相除

    不使用乘号,除号和取模符号将两数相除.如果溢出返回 MAX_INT.详见:https://leetcode.com/problems/divide-two-integers/description/ ...

随机推荐

  1. Java 锁 概念介绍

    一   Java中的锁是什么? /* * 一 Java锁定义? * 在计算机科学中,锁(lock)或互斥(mutex)是一种同步机制,用于在有许多执行线程的环境中强制对资源的访问限制. * 锁旨在强制 ...

  2. kibana 对es的简单操作。

    一.查询和查看. #1.查询所有的数据 GET _search { "query": { "match_all":{} } } #2. 查看ES集群的健康状态 ...

  3. PostgreSQL源码编译

    环境:Ubuntu 16.04+PostgresQL13.2 1.指定安装路径 ./configure --prefix=/opt/postgresql 2.编译安装 sudo make sudo m ...

  4. TensorFlow 深度学习中文第二版·翻译完成

    原文:Deep Learning with TensorFlow Second Edition 协议:CC BY-NC-SA 4.0 不要担心自己的形象,只关心如何实现目标.--<原则>, ...

  5. AI 智能写情诗、藏头诗

    一.AI 智能情诗.藏头诗展示 最近使用PyTorch的LSTM训练一个写情诗(七言)的模型,可以随机生成情诗.也可以生成藏头情诗. 在特殊的日子用AI生成一首这样的诗,是不是很酷!下面分享下AI 智 ...

  6. TCP的报文详细解读

    这张图好像挺有名的,其实一开始我看见的时候是一脸懵逼的,但是通过翻书(大学时代最害怕的计算机网络),查阅他人博客等等办法,最后终于有了一个系统的了解,当然,这里知识点多而杂,大家可以多看几遍,结合上面 ...

  7. 有手就行5——jenkins项目构建类型(pipeline流水线项目构建推荐)

    有手就行5--jenkins项目构建类型(pipeline流水线项目构建推荐) Pipeline简介 1) 概念 Pipeline,简单来说,就是一套运行在 Jenkins 上的工作流框架,将原来独立 ...

  8. Spring中声明式事务的几个属性的解释

    声明式事务 @Transactional (通常用在service层)事务属性:传播行为,隔离级别,回滚,只读,过期 1,spring支持事务传播行为:propagation(常用以下两个)    ① ...

  9. pandas中常用的操作一

    pandas中常用的功能: 1.显示所有的列的信息,999表示显示最大的列为999 pd.options.display.max_columns=999 2.读取excel时设置使用到列的名称,和列的 ...

  10. 《PHP程序员面试笔试宝典》——如何处理与面试官持不同观点这个问题?

    如何巧妙地回答面试官的问题? 本文摘自<PHP程序员面试笔试宝典> 在面试的过程中,求职者所持有的观点不可能与面试官一模一样,在对某个问题的看法上,很有可能两个人相去甚远.当与面试官持不同 ...