剑指 Offer II 001. 整数除法
难度简单35
给定两个整数 a
和 b
,求它们的除法的商 a/b
,要求不得使用乘号 '*'
、除号 '/'
以及求余符号 '%'
。
注意:
- 整数除法的结果应当截去(
truncate
)其小数部分,例如:truncate(8.345) = 8
以及truncate(-2.7335) = -2
- 假设我们的环境只能存储 32 位有符号整数,其数值范围是
[−231, 231−1]
。本题中,如果除法结果溢出,则返回231 − 1
示例 1:
1 | 输入:a = 15, b = 2 |
示例 2:
1 | 输入:a = 7, b = -3 |
示例 3:
1 | 输入:a = 0, b = 1 |
示例 4:
1 | 输入:a = 1, b = 1 |
提示:
-231 <= a, b <= 231 - 1
b != 0
注意:本题与主站 29 题相同:https://leetcode-cn.com/problems/divide-two-integers/
快速幂思路
朴素的思路是从a一直减去b,直到a的值小于等于0,这样的话一定会超时
能不能想一种办法让他减的比较快呢?
参考快速幂算法,每次增加底的值
在本题目中,增加减数的值,每次让减数翻倍,那么对应的答案的值也会翻倍
例如10除以3
第一次除数为3,10-3>0,此时结果是1,让3翻倍,除数变成了6.
第二次除数为6,10-6>0,此时结果是2,让6翻倍,除数变成了12.
第三次除数是12,10-12<0,结果不能翻倍,此时结果在2和4之间.
然后再使用递归的方法求(10-6,3)的结果就能得到1.
将求两者的和就能得到最后的结果。
1 | class Solution { |