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

相关推荐
葫三生20 分钟前
《论三生原理》神话学构想与“神话历史”理论、《古史中的神话》思路异同?
大数据·人工智能·科技·深度学习·算法
liliangcsdn1 小时前
因子分析指标概念与示例
算法·机器学习
SupL!2 小时前
LoftQ原理
算法
Navigator_Z3 小时前
LeetCode //C - 1240. Tiling a Rectangle with the Fewest Squares
c语言·算法·leetcode
稻米哟3 小时前
力扣100——双指针
算法·leetcode
明志数科5 小时前
具身智能真机采集工程实践:5类高频失效模式与规避清单
人工智能·算法·机器学习
CSDN_RTKLIB5 小时前
空间哈希与拓扑缓存
算法
大熊背6 小时前
IspPipeline色相旋转模块实现
人工智能·算法·计算机视觉
爱学习的小白柏6 小时前
同城双活的核心不是双活,是逼着数据别出机房
大数据·人工智能·算法·langchain·ai编程
鹿角片ljp6 小时前
LeetCode 31:下一个排列|右找小,右找大,交换,右反转
java·数据结构·算法