mycode 91.28%
class Solution(object): def divide(self, dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ if divisor == 0: return None if((dividend^divisor)<0): flag = -1 else: flag = 1 dividend = abs(dividend) if dividend < 0 else dividend divisor = abs(divisor) if divisor < 0 else divisor MAX = 2147483647 MIN = -2147483648 res = (dividend // divisor) if flag == -1: return max(MIN,flag*res) else: return min(MAX,res)
参考:
思路:其实时不能用除法运算的,但是我还是用了。。。。
这道题的要求是在不使用乘法、除法、取模运算的前提下实现两个整数相除。如果溢出,返回MAX_INT。这道题的直接思路是用被除数不断减去除数,直到为0。这种方法的迭代次数是结果的大小,即比如结果为n,算法复杂度是O(n)。可以采用位运算进行优化,即模拟计算机上的除法运算。将整数转化成二进制形式,即num = a0*2^0 + a1*2^1 + a2*2^2 + ... + an*2^n。基于以上这个公式以及左移一位相当于乘以2,可以先让除数左移直到大于被除数之前得到一个最大的基数。然后每次用被除数去减去这个基数,同时结果增加2^k。接下来继续重新左移除数左移迭代,直到被除数不大于除数为止。因为这个方法的迭代次数是按2的幂直到结束,所以时间复杂度为O(logn)。值得注意的地方,主要就是处理符号和溢出问题。对于溢出问题,可以先采用long long进行计算,也可以在移位前判断移位后是否溢出。
#时间复杂度:O(logn)
#空间复杂度:O(1)
def divide(dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ positive = (dividend < 0) is (divisor < 0) dividend, divisor = abs(dividend), abs(divisor) res = 0 while dividend >= divisor: temp, i = divisor, 1 print(dividend,divisor,temp,i,res) while dividend >= temp: dividend -= temp res += i i <<= 1 temp <<= 1 print('..',dividend,divisor,temp,i,res) if not positive: res = -res return min(max(-2147483648, res), 2147483647)
下面这个更好理解些
class Solution(object): def divide(self, dividend, divisor): """ :type dividend: int :type divisor: int :rtype: int """ ispositive = True if dividend > 0 and divisor < 0: ispositive = False if dividend < 0 and divisor > 0: ispositive = False dividend = abs(dividend);divisor = abs(divisor) if dividend < divisor: return 0 tmp = divisor ans = 1 while dividend >= tmp: tmp <<= 1 if tmp > dividend: break ans <<= 1 tmp >>= 1 nans = ans + self.divide(dividend - tmp,divisor) if ispositive: if ans > 2147483647: return 2147483647 return nans if ans >= 2147483648: return -2147483648 return 0 - nans 左移