本文答案参考自leetcode众网友的题解(因为没有官方题解[尬笑]),我来为大家讲解一下关于leetcode两数之和怎么算?跟着小编一起来看一看吧!

leetcode两数之和怎么算(LeetCode算法笔记第29题)

leetcode两数之和怎么算

本文答案参考自leetcode众网友的题解。(因为没有官方题解[尬笑])

题目描述

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

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

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


不能使用乘法、除法和 mod 运算符 ?[思考]

那还有什么运算呢?

对了,还有 加减 以及 比较底层的 位运算

此外,这里还有正负号的问题,相信大家应该可以应对[灵光一闪]。

【方法1】(加)减法以及(位运算)优化

小学二年级([看])就学过:多次加就是乘,多次减就是除。

所以,我们可以用多次减法来模拟除法,像这样:

9 / 2 = 4 (整除)

就等于 9 - 2 - 2 - 2 - 2 = 1

  1. 开启循环,每次循环中将 被除数 减去 除数,并记录次数
  2. 被除数 小于 除数 时结束循环,所记录的次数就是答案。


这就是中等 (・∀・*)?怎么可能!

如果要计算 1000000 / 1 ,那岂不是要减很多很多次?

有人说,可以判断呀,判断除数是不是 1.

那 1000000 / 2 ,1000000 / 3 也要判断?

这不可能的吧 o((>ω< ))o

所以我们可以 放大除数 ,像这样:

9 / 2 = 9 / 4 * 2 = 4

  1. 同样开启循环,每次循环中
    1. 如果 被除数 大于 除数,则将除数乘以二(对2情有独钟啊[耶]),直到被除数 小于 除数,然后将 被除数 减去 除数,并记录 相当于原除数做减法 的次数
    2. 如果 被除数 小于 除数
      1. 如果除数是放大过的,则将除数除以二
      2. 如果除数是原来的,即可得到答案(即次数)

以上过程严格按照程序逻辑排版

其中,乘以二除以二的操作可以通过左右位移来实现

即 除数 << 1 表示乘以二,除数 >> 1 表示除以二

当然得注意除数的溢出问题。


以上描述可能有点细节上的模糊,但只需理解其思想就行了( 吧?(⊙﹏⊙))

[来看我]​[来看我]​[来看我]

,