力扣专题——剑指 Offer II 001. 整数除法
Posted super尚
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了力扣专题——剑指 Offer II 001. 整数除法相关的知识,希望对你有一定的参考价值。
题目:
给定两个整数 a 和 b ,求它们的除法的商 a/b ,要求不得使用乘号 ‘*’、除号 ‘/’ 以及求余符号 ‘%’ 。
注意:
整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231−1]。本题中,如果除法结果溢出,则返回 231 − 1
解题思路
除法最简单的思路就是一直减除数,直到减不动为止,减的次数就是商。当然前提要判断被除数和除数的正负,同号不用管,异号的时候要变为同号,并标记结果。
其次更快捷一点的方法是移位操作:
1.每次将除数左移一位,相当于除数乘以2,也就将初始化为1的商左移一位。
2.直到被除数小于等于当前除数的2倍,这样再让被除数减去当前除数。
3.剩下的值继续从初始的除数从第一步开始。
这里同样要判断除数被除数是否同号,来对商进行确定。
还有一点要注意的是如果商的值大于等于2**31,那么ret要减1,这个就很奇怪
代码
class Solution:
def divide(self, a: int, b: int) -> int:
ret=0
flag=False if(a>0 and b>0) or (a<0 and b<0) else True
a,b=abs(a),abs(b)
def calc(x,y):
n=1
while x>y<<1:
y<<=1
n<<=1
return n,y
while a>=b:
cnt,val=calc(a,b)
ret+=cnt
a=a-val
ret=-ret if flag else ret
return ret-1 if ret>=2**31 else ret
以上是关于力扣专题——剑指 Offer II 001. 整数除法的主要内容,如果未能解决你的问题,请参考以下文章
力扣1190/6/剑指Offer57-II/58-I/-II