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

相关推荐
MZWeiei30 分钟前
PTA:运用顺序表实现多项式相加
算法
GISer_Jing37 分钟前
Javascript排序算法(冒泡排序、快速排序、选择排序、堆排序、插入排序、希尔排序)详解
javascript·算法·排序算法
cookies_s_s37 分钟前
Linux--进程(进程虚拟地址空间、页表、进程控制、实现简易shell)
linux·运维·服务器·数据结构·c++·算法·哈希算法
不想编程小谭1 小时前
力扣LeetCode: 2506 统计相似字符串对的数目
c++·算法·leetcode
水蓝烟雨1 小时前
[HOT 100] 2187. 完成旅途的最少时间
算法·hot 100
01_2 小时前
力扣hot100——LRU缓存(面试高频考题)
leetcode·缓存·面试·lru
菜鸟一枚在这3 小时前
深度解析建造者模式:复杂对象构建的优雅之道
java·开发语言·算法
gyeolhada3 小时前
2025蓝桥杯JAVA编程题练习Day5
java·数据结构·算法·蓝桥杯
阿巴~阿巴~3 小时前
多源 BFS 算法详解:从原理到实现,高效解决多源最短路问题
开发语言·数据结构·c++·算法·宽度优先
给bug两拳3 小时前
Day9 25/2/22 SAT
算法