【LeetCode】29. 两数相除

1 问题

给你两个整数,被除数 dividend 和除数 divisor。将两数相除,要求 不使用 乘法、除法和取余运算。

整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。

返回被除数 dividend 除以除数 divisor 得到的 商 。

注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 [−231, 231 − 1] 。本题中,如果商 严格大于 231 − 1 ,则返回 231 − 1 ;如果商 严格小于 -231 ,则返回 -231 。

示例 1:

输入: dividend = 10, divisor = 3

输出: 3

解释: 10/3 = 3.33333... ,向零截断后得到 3 。

示例 2:

输入: dividend = 7, divisor = -3

输出: -2

解释: 7/-3 = -2.33333... ,向零截断后得到 -2 。

2 答案

自己写的,时间超出限制

python 复制代码
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        res = 0
        a = True
        if dividend > 0 and divisor < 0:
            a = False
        elif dividend < 0 and divisor > 0:
            a = False
        dividend, divisor = abs(dividend), abs(divisor)
        while dividend >= divisor:
            dividend -= divisor
            res += 1
        if a:
            return res
        else:
            return -res

官方解,利用位运算

python 复制代码
class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        sign = (dividend > 0) ^ (divisor > 0)  # 异或 两个位相同为0,相异为1
        dividend = abs(dividend)
        divisor = abs(divisor)
        count = 0
        
        while dividend >= divisor:  # 要等于号,不然乘除情况不行
            count += 1
            divisor <<= 1 # 左移一位乘2
        result = 0
        while count > 0:
            count -= 1
            divisor >>= 1 # 右移一位除2
            if divisor <= dividend:  # 要等于号,不然乘除情况不行
                result += 1 << count #这里的移位运算是把二进制(第count+1位上的1)转换为十进制,左移count位
                dividend -= divisor
        if sign: result = -result
        return result if -(1<<31) <= result <= (1<<31)-1 else (1<<31)-1 # 这里只写 (1<<31)-1,因为只有-2147483648/-1可能越界

类似于位竖式除法,代码中 dividend >= divisor divisor <= dividend,要等于号,不然乘除情况不行

相关推荐
卡洛斯(编程版38 分钟前
(1) 哈希表全思路-20天刷完Leetcode Hot 100计划
python·算法·leetcode
NAGNIP2 小时前
DeepSeekMoE 架构解析
算法
不喜欢学数学er2 小时前
算法第五十二天:图论part03(第十一章)
算法·深度优先·图论
养成系小王2 小时前
四大常用排序算法
数据结构·算法·排序算法
NAGNIP2 小时前
一文搞懂DeepSeek LLM
算法
已读不回1432 小时前
设计模式-策略模式
前端·算法·设计模式
MrZhangBaby2 小时前
SQL-leetcode—3374. 首字母大写 II
linux·sql·leetcode
CoovallyAIHub3 小时前
标注成本骤降,DINOv3炸裂发布!冻结 backbone 即拿即用,性能对标SOTA
深度学习·算法·计算机视觉
BB学长3 小时前
流固耦合|01流固耦合分类
人工智能·算法
汤永红3 小时前
week3-[分支嵌套]方阵
c++·算法·信睡奥赛