LeetCode 题解(177): Divide Two Integers

来源:互联网 发布:电网linux系统常用命令 编辑:程序博客网 时间:2024/04/30 21:15

题目:

Divide two integers without using multiplication, division and mod operator.

If it is overflow, return MAX_INT.

题解:

只能用移位运算,以2为基模拟除法。

边界情况: divisor == 0 ==> result = INT_MAX, dividend == INT_MIN, divisor == -1 溢出 ==> result = INT_MAX

dividend == INT_MIN,divisor != -1:

dividend -= abs(divisor), result++。

用base表示基,求divisor不大于dividend的最大值,然后dividend减去divisor,更新result, base和divisor。

C++版:

class Solution {public:    int divide(int dividend, int divisor) {       if(divisor == 0)           return INT_MAX;        bool isNeg = abs((dividend ^ divisor) >> 31);        int result = 0;        if(dividend == INT_MIN) {            if(divisor == -1)                return INT_MAX;            dividend += abs(divisor);            result++;        }        if(divisor == INT_MIN)            return result;        dividend = abs(dividend);        divisor = abs(divisor);        int base = 0;        while(divisor <= (dividend >> 1)) {            divisor <<= 1;            base++;        }        while(base >= 0) {            if(dividend >= divisor) {                result += (1 << base);                dividend -= divisor;            }            divisor >>= 1;            base--;        }        return isNeg ? -result : result;    }};

Java版:

public class Solution {    public int divide(int dividend, int divisor) {    if(divisor == 0)      {          return Integer.MAX_VALUE;      }      boolean isNeg = (dividend^divisor)>>>31 == 1;      int res = 0;      if(dividend == Integer.MIN_VALUE)      {          dividend += Math.abs(divisor);          if(divisor == -1)          {              return Integer.MAX_VALUE;          }          res++;      }      if(divisor == Integer.MIN_VALUE)      {          return res;      }      dividend = Math.abs(dividend);      divisor = Math.abs(divisor);      int digit = 0;      while(divisor <= (dividend>>1))      {          divisor <<= 1;          digit++;      }      while(digit>=0)      {          if(dividend>=divisor)          {              res += 1<<digit;              dividend -= divisor;          }          divisor >>= 1;          digit--;      }      return isNeg?-res:res;    }}

Python版:

class Solution:    # @param {integer} dividend    # @param {integer} divisor    # @return {integer}    def divide(self, dividend, divisor):        if divisor == 0:            return sys.maxint        if dividend == -2147483648 and divisor == -1:            return 2147483647        isNeg = abs((dividend ^ divisor) >> 31)        dividend = abs(dividend)        divisor = abs(divisor)        result, base = 0, 0        while divisor <= (dividend >> 1):            divisor <<= 1            base += 1        while base >= 0:            if dividend >= divisor:                result += (1 << base)                dividend -= divisor            divisor >>= 1            base -= 1                return -result if isNeg else result

0 0
原创粉丝点击