`

Leetcode - Divide Two Integers

 
阅读更多
[分析]
不能使用乘、除、取模运算,直接的思路当然是一次减一个除数,当然面试是没必要考这个的。如何提高效率呢?那就是要尽可能减少运算次数,能不能一次减去除数的若干倍呢?在pow(x,n)和sqrt(x)已指出数值计算题目通常两个思路,二分法和以2为基的位运算。左移一位相当于乘2,于是我们可以尝试每次减去除数的2^k倍,如何确定k取值?只要它满足:divs * 2^k <= divd <= divs * 2^(k+1)。
实现时需要注意的是,为避免溢出,使用long类型存放除数和被除数,为计算方便,均将其转为正数,因为int类型最小负数的绝对值比最大正数大1,因此需要先将其保存为long类型后再取绝对值,不然会溢出。此外,循环结束后若商是负数说明发生了溢出,考虑Integer.MIN_VALUE 除以 1的情况,对于这种corner case,可以放在前面单独处理也可以在最后进行检查,看个人习惯。

[ref]
http://www.cnblogs.com/TenosDoIt/p/3795342.html

public class Solution {
    public int divide(int dividend, int divisor) {
        if (divisor == 0)
            return Integer.MAX_VALUE;
        boolean isPositive = ((dividend ^ divisor) >>> 31) == 1 ? false : true;
        // avoid overflow
        long divd = dividend;
        if (divd < 0) divd = -divd;
        long divs = divisor;
        if (divs < 0) divs = -divs;
        int res = 0;
        while (divd >= divs) {
            long a = divs;
            int i = 1;
            for (; a <= divd; i++)
                a <<= 1;
            res += 1 << (i - 2);
            divd -= divs << (i - 2);
        }
        if (res >= 0) 
            return isPositive ? res : -res;
        else
            return isPositive ? Integer.MAX_VALUE : Integer.MIN_VALUE;
    }
}
分享到:
评论

相关推荐

    js-leetcode题解之29-divide-two-integers.js

    js js_leetcode题解之29-divide-two-integers.js

    c语言-leetcode 0029-divide-two-integers.zip

    c c语言_leetcode 0029_divide_two_integers.zip

    leetcode1-240题中文题解,md格式,java

    8. leetcode-29-Divide-Two-Integers.md:第29题,两数相除,涉及到整数除法和位运算。 9. leetcode-218-The-Skyline-Problem.md:第218题,天际线问题,可能涉及到二维数组处理和线段树或平衡二叉搜索树的数据结构...

    _leetcode-python.pdf

    - Divide Two Integers: 实现整数除法,不能使用乘法、除法和模运算符。 - Search in Rotated Sorted Array: 在旋转过的排序数组中进行二分查找。 - Search for a Range: 给定一个按照升序排列的数组,和一个目标值...

    丢失的最小正整数leetcode-interview-algorithm:面试时的JS算法

    Divide Two Integers 两个整数相除,要求不能使用 *,/,以及mod操作符,返回除数,若除数有小数点,只返回整数部分,如2.789,只应返回2,此题为leetcode上的题目 Random Numbers 用计算机生成了N个1到1000之间的...

    leetcode叫数-python01:Python01

    先来看LeetCode-29上的Divide Two Integers题目要求: Divide two integers without using multiplication, division and mod operator. If it is overflow, return MAX_INT. 1 2 3 就是说不用乘法,除法,求模运算...

    LeetCode最全代码

    371 | [Sum of Two Integers](https://leetcode.com/problems/sum-of-two-integers/) | [C++](./C++/sum-of-two-integers.cpp) [Python](./Python/sum-of-two-integers.py) | _O(1)_ | _O(1)_ | Easy | LintCode | ...

    leetcode切割分组-leetcode:leetcode

    029_divide_two_integers*.py # 实现整除 050_pow.py # 实现乘幂 066_plus_one.py # 数列末尾值+1 069_sqrt.py # 实现开根号 136_single_number.py # 位操作:异或(xor)操作 x ^ 0 = x; x ^ x = 0 sum 001_two_sum....

    Dir-For-LeetCode

    问题 完全的 017_Letter_Combinations_of_a_Phone_Number 018_4总和 019_Remove_Nth_Node_From_End_of_List 020_Valid_Parentheses ... 029_Divide_Two_Integers 030_Substring_with_Concatenation_of

    lovely-nuts:这是一个可爱的坚果

    Practice-Leetcode 这是一个Chinese School Girl:China:用来练习leetcode的文档....29.Divide Two Integers 二进制累加代替除法,防止溢出 36.Valid Sudoku set去重复 2018/04/19: 038.Count and Say 递归 040.C

    leetcodepalindrom-solutions_to_problems:解决问题的解决方案

    5. **除以两个整数(Divide Two Integers)** 任务是实现一个函数,模拟整数除法,返回商(不考虑浮点数部分)。这个题目需要考虑整数溢出问题,可以使用位运算和减法进行求解。例如,将除数和被除数都乘以一个足够大...

Global site tag (gtag.js) - Google Analytics