29. Divide Two Integers

来源:互联网 发布:java 0x00 转为数字 编辑:程序博客网 时间:2024/05/16 10:50

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

If it is overflow, return MAX_INT.

这道题……可以说是非常坑了……
首先是溢出问题,有两种情况会造成溢出,一个是divisor为零的情况,还有一种是INT_MIN/(-1) 的情况(因为 abs(INT_MIN) = INT_MAX + 1

其次就是算法的选择。最简单的方法很显然是不断地减去除数,直到剩下的数小于除数,但这种方法效率不高,会超时。
考虑另一种方法:除数*2和被除数比较,如果还小于除数就再乘二(左移一位)……直到大于被除数。这种方法和第一种方法相比就高效得多。

class Solution {public:    int divide(int dividend, int divisor) {        //处理溢出        if (divisor == 0 || dividend == INT_MIN && divisor == -1) return INT_MAX;        bool isMinus = (dividend < 0 && divisor > 0 || dividend > 0 && divisor < 0);        //用long long是为了避免abs(INT_MIN)溢出        long long dvd = labs(dividend);        long long dvs = labs(divisor);        int ans = 0;        while (dvd >= dvs) {            long long tmp = dvs, multiple = 1;            while (dvd >= (tmp << 1)) {                tmp <<= 1;                multiple <<= 1;            }            dvd -= tmp;            ans += multiple;        }        return isMinus ? (0 - ans) : ans;    }};
原创粉丝点击