【leetcode】(python) 29. Divide Two Integers

Description

  1. Divide Two Integers Medium

Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator.

Return the quotient after dividing dividend by divisor.

The integer division should truncate toward zero.

Example

  • Example 1:

    Input: dividend = 10, divisor = 3
    Output: 3

  • Example 2:

    Input: dividend = 7, divisor = -3
    Output: -2

Note:

  • Both dividend and divisor will be 32-bit signed integers.
  • The divisor will never be 0.
  • Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231, 231 − 1]. For the purpose of this problem, assume that your function returns 231 − 1 when the division result overflows.

题目大意

求两数相除后的商值,要求不能用乘法、除法及取模操作。

被除数和除数是32位整数,且除数不为0,整数范围在[−231,231 − 1]

解题思路

刚开始的思路是不能用乘除法的话,那可以用加减法吧,就是被除数-除数大于除数时,使次数加一(也就是商加一),一直到不满足条件时,那么最后的累加次数就是商值。但是这样做的结果就是超时,因为被除数较大,除数较小时的时间复杂度很大。

那既然这样太慢,为了加速运算,可以不断将除数和商乘以2, 使得能尽快接近被除数。所以这里可以用移位来进一步加速。思路是,如果被除数大于或等于除数,则进行如下循环,定义变量tmp等于除数,定义计数cnt,当tmp的两倍小于等于被除数时,进行如下循环,tmp扩大一倍,cnt扩大一倍,然后更新res和m。注意该题还有范围的限定[−231,231 − 1]

code

class Solution:
    def divide(self, dividend: int, divisor: int) -> int:
        sign = -1 if ((dividend < 0 and divisor > 0) or (dividend > 0 and divisor < 0)) else 1
        m = abs(dividend)
        n = abs(divisor)
        if m < n:
            return 0
        res = 0
        while m >= n:
            tmp = n
            cnt = 1
            while m >= (tmp<<2):
                tmp <<= 2
                cnt <<= 2
            res += cnt
            m -= tmp
        if sign==-1:
            return max(-res, -2**31)
        else:
            return min(res, 2**31 - 1)
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值