【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,要等于号,不然乘除情况不行

相关推荐
骑自行车的码农13 小时前
【React用到的一些算法】游标和栈
算法·react.js
博笙困了14 小时前
AcWing学习——双指针算法
c++·算法
moonlifesudo14 小时前
322:零钱兑换(三种方法)
算法
NAGNIP1 天前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
美团技术团队1 天前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
Fanxt_Ja2 天前
【LeetCode】算法详解#15 ---环形链表II
数据结构·算法·leetcode·链表
侃侃_天下2 天前
最终的信号类
开发语言·c++·算法
茉莉玫瑰花茶2 天前
算法 --- 字符串
算法
博笙困了2 天前
AcWing学习——差分
c++·算法
NAGNIP2 天前
认识 Unsloth 框架:大模型高效微调的利器
算法