[LeetCode]29、两数相除

2019-07-28  本文已影响0人  河海中最菜

题目描述

给定两个整数,被除数 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。

思路解析

非常简单的思路就是除数-被除数的次数,有多少就是多少
但是会出现一个问题,就是被除数很小,除数很大,时间复杂过高,利用位运算加速。
被除数每次翻倍,结果也翻倍
当不能翻倍的时候,回归开始,重复计算

class Solution:

    def divide(self, a, b):
        '''
        正负号
        越界
        =0
        :param a:
        :param b:
        :return:
        '''
        sign = 1 if a ^ b >= 0 else -1
        a = abs(a)
        b = abs(b)
        if b == 0 or a < b:
            return 0
        res = 0
        while a >= b:
            temp, add = b, 1
            while a >= temp:
                a -= temp
                res += add
                add <<= 1
                temp <<= 1
        res *= sign

        if res > 2 ** 31 - 1:
            return 2 ** 31 - 1
        if res < -2 ** 31:
            return -2 ** 31
        return res
AC29
上一篇 下一篇

猜你喜欢

热点阅读