题目难度: 简单
原题链接
休息了一个月, 我又满血回来了, 今天我们来开始一个新的系列 - Leetcode 的剑指 Offer(专项突击版)!!!
它相比剑指 Offer (Easy~Medium) 或者程序员面试金典 (Medium~Hard), 难度都要大一些 (Medium+~Hard), 更适合进阶, 但考虑到现在越来越卷的面试, 推荐程度更高了, 6 颗星!!! ✨✨✨✨✨✨
如果你是萌新, 可以先看看其他两个系列哦, 公众号里回复
剑指offer
和面试金典
关键字就能看到了
这个系列的更新频率还是老样子: 每周日晚上的 6 点 45 分, 大家可以多多关注哦
另外大家在我的公众号"算法精选"中的聊天框中回复
剑指offer2
就能看到新系列当前已经更新的文章了
12(0b1100)
, 就相当于 8(0b1000)+4(0b0100)
128/3
可以分解为 3*(32+8+2)
, 即 3*42
class Solution:
def divide(self, dividend: int, divisor: int) -> int:
# 核心思路: 2的幂和除数乘积不断左移一位, 直到最接近且小于等于被除数, 循环该过程直到被除数<除数
# 先将数字都转为正数, 并记录商的符号
neg = False
if dividend < 0:
dividend = -dividend
neg = not neg
if divisor < 0:
divisor = -divisor
neg = not neg
res = 0
# 注意循环条件是大于等于, 因为等于情况下仍有商, 为1
while dividend >= divisor:
# 2的幂初始化为1
mi = 1
# 除数乘积初始化为除数
cur = divisor
# 注意循环条件是大于等于, 相等时表示恰好整除
while dividend >= (cur << 1):
# 2的幂和除数乘积不断左移一位, 直到最接近且小于等于被除数
cur <<= 1
mi <<= 1
# 此时的除数乘积就是最接近且小于等于被除数的数了
# 商加上当前的2的幂
res += mi
# 被除数减去已经使用的除数乘积
dividend -= cur
# 恢复符号
if neg:
# 负号时需要取相反数
res = -res
# 注意溢出时取最大正数
mn, mx = -(2**31), 2**31 - 1
if res < mn or res > mx:
return mx
return res
大家可以在下面这些地方找到我~
我的 GitHub
我的 Leetcode
我的 CSDN
我的知乎专栏
我的头条号
我的牛客网博客
我的公众号: 算法精选, 欢迎大家关注~