zoukankan      html  css  js  c++  java
  • Leetcode 29.两数相除 By Python

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

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

    示例 1:

    输入: dividend = 10, divisor = 3
    输出: 3
    

    示例 2:

    输入: dividend = 7, divisor = -3
    输出: -2
    

    说明:

    • 被除数和除数均为 32 位有符号整数。
    • 除数不为 0。
    • 假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。

    思路

    除法其实可以用加法的思路做,循环减去divisor就好了,这样的时间复杂度是(O(dividend)),遗憾的是这样是过不了的。所以要另辟蹊径,用位运算。

    (dividend = quotient*divisor + remainder)

    解法:

    • 枚举(i)降序)找到使得$divisor << i (能够比)dividend$小的,规定一个暂时变量tmp,更新tmp
    • 不断更新(tmp + (divisor << i))(dividend)小的位置(i),并记录下来

    代码

    class Solution(object):
        def divide(self, dividend, divisor):
            """
            :type dividend: int
            :type divisor: int
            :rtype: int
            """
            if dividend == 0: return 0
            if divisor == 0: return
    
            sign = -1 if ((dividend < 0) ^ (divisor < 0)) else 1	#标记是否为负
            dividend = abs(dividend)
            divisor = abs(divisor)
    
            quotient = 0
            tmp = 0
            for i in range(32,-1,-1):	#逆序枚举,范围为[0,32]
                if tmp + (divisor << i) <= dividend:
                    tmp += divisor << i		#更新tmp的值
                    quotient |= 1 << i		#记录i的位置,从2进制的或运算就是有1就为1
    
            quotient *= sign	#虽然题目说了不要用乘法,但是为了代码的简洁这里还是用了
            if quotient < -(2 ** 31) or quotient > 2 ** 31 - 1:
                return 2 ** 31 - 1
            else:
                return quotient
    
  • 相关阅读:
    学习:多项式算法----FWT
    学习:多项式算法----FFT
    学习:STL----优先队列
    Python中pip安装包出现Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection
    ELK集群redis服务因数据量太大导致内存使用率暴涨故障修复
    zabbix 历史数据存入elasticsearch
    elk+filebeat+redis日志系统部署
    Linux 服务守护脚本
    Nginx 配置临时维护页
    Linux DDos防御
  • 原文地址:https://www.cnblogs.com/MartinLwx/p/9721010.html
Copyright © 2011-2022 走看看