LeetCode题解(python)
29. 两数相除
题目描述4
给定两个整数,被除数 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。
解题心得
本题的意义较大,主要有以下几个方面:
- 考虑基础运算的实现,最基本的算法思想
- 使用移位法进行运算(最基本的解题思想是减法,但是效率非常低,甚至超时)——二进制编码思想
- 考虑异或(判断正负符号)和移位运算符
- 各种情况考虑,减小不必要的运算,例如除数为1的情况。
- 整理部分知识如下:
2进制
0 + 1 = 1
1 + 1 = 10
10 + 1 = 11
11 + 1 = 100print(bin(1)) #0b1
print(bin(2)) #0b10
print(bin(10)) #0b1010
print(bin(100)) #0b1100100右移>>
print(3 >> 1) #1
print (0b11) #3左移<<
print(3 << 1) #6
print(bin(3))按位与 &:同为1才为1,否则为0
print(0b1100 & 0b1000) #8按位或 |
按位异或 ^
奇偶判定
print(5 & 1) #1
print(4 & 1) #0
解题代码
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
dd = abs(dividend)
ds = abs(divisor)
rel = 0
while dd>=ds:
bds = ds
count = 1
while dd >= (bds<<1):
print(bds)
count = count<<1
bds = bds<<1
rel = rel+count
dd = dd - bds
if (dividend>0)^(divisor>0):
rel = -rel
else:
rel = rel
if rel<-pow(2,31) or rel>pow(2,31)-1:
return pow(2,31)-1
else:
return rel