给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。
本题中,如果除法结果溢出,则返回 231 − 1。
我最后提交的答案,44ms,击败27%
思路就是位运算,创新点是我把每一次的i都加入一个列表,其中每一个i都是2的幂,所以我最后把列表中的i都换成幂,得到答案,我举一个例子:23/4,第一轮:4x2^ (2)=16<23,k=[2],dd=23-16=7,第二轮:4x2 ^(0)=4<7,k=[2,0] i=0了迭代完毕,计算得到ans=5
#判断fh(符号)
if dividend>0 and divisor<0 or dividend<0 and divisor>0:
fh=-1
elif dividend<0 and divisor<0 or dividend>0 and divisor>0:
fh=+1
else:
fh=+1
dd=abs(dividend) #取绝对值方便运算
dr=abs(divisor)
i=0
k=[]
for i in range(32,-1,-1): #让i从32到0
if dr<<i <= dd: #只有当dr*2^i刚好小于dd的时候
#这个i就是最大的那个
dd=dd-(dr<<i) #从第二轮开始,dd变成了dividend与
#dr*2^i的差值,继续找这个差值中有多少个dr
k.append(i) #依次加入迭代中成立的i,
ans=0
for i in k: #将k中的i浮现出来,就是我们的答案了
ans=ans+2**i
if fh*ans < -2**31 or fh*ans > (2**31) -1:
return 2**31 -1
else:
return fh*ans
第一次的代码,希望做简单减法,来找到答案,小值都还好,但是遇到100000/1的时候,要执行100000次,超时妥妥的
dd=dividend
dr=divisor
if dd>0 and dr<0 or dd<0 and dr>0:
fh=-1
elif dd<0 and dr<0 or dd>0 and dr>0:
fh=+1
else:
fh=+1
dd1=abs(dd)
dr1=abs(dr)
i=0
c=dd1-dr1
d=0
while True:
if c==0: #比如3/3,c=0,i=1
i=i+1
break
if c<0:
break
i=i+1
c=c-dr1
d=fh*i
if d<-2**31:
return 2**31-1
if d>2**31-1:
return 2**31-1
return d