二刷29. Divide Two Integers

    NOTES ON SOME BIT HACKS: 
    1. x << n is equivalent to x * Math.pow(2, n). (<< is Leftshift Operator)
    2. 1 << x is equivalent to Math.pow(2, x). (<< is Leftshift Operator)
    3. x and y have opposite signs if (x ^ y) < 0. (^ is Bitwise XOR)

注意几点,一开始被除数、除数、商全部转化成long. 并且被除数除数都取转化成long之后的绝对值带入计算。需要处理的edge cases只有除数为0,以及被除数为Integer.MIN_VALUE除数为 -1的情况,此时商为Integer.MAX_VALUE. sign都可一开始就求出来。

class Solution {
    public int divide(int dividend, int divisor) {
        if (divisor == 0){
            return Integer.MAX_VALUE;
        }            
        if (dividend == Integer.MIN_VALUE && divisor == -1){
            return Integer.MAX_VALUE;
        }
        int sign = 1;
        if (dividend > 0 && divisor < 0 || (dividend < 0 && divisor > 0)){
            sign = -1;
        }
        long lDividend = Math.abs((long) dividend);
        long lDivisor = Math.abs((long)divisor);
        int powerOfTwo = 0;
        long quotient = 0;
        while (lDividend >= lDivisor){
            powerOfTwo = 0;
            while (lDivisor << powerOfTwo <= lDividend){
                powerOfTwo++;
            }
            powerOfTwo = powerOfTwo - 1;
            quotient += (1 << powerOfTwo);
            lDividend -= (lDivisor << powerOfTwo);
        }
        return (int) quotient*sign;
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,948评论 18 399
  • 背景 一年多以前我在知乎上答了有关LeetCode的问题, 分享了一些自己做题目的经验。 张土汪:刷leetcod...
    土汪阅读 12,860评论 0 33
  • 凌晨半夜一点多,高校老师小董老师心急如焚赶往学校陪同学生一起去医院急诊。他刚接到学校宿管生活员电话,作为班主...
    Mr董先生阅读 367评论 0 2
  • 我自己的故事,说说也无妨。 我出生在一个重男轻女还尚存在的年代,所以才有了这个名字,但是只有妈妈对我有些冷淡,其他...
    我是猫s阅读 381评论 0 0

友情链接更多精彩内容