zoukankan      html  css  js  c++  java
  • LeetCode | Divide Two Integers

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

    If it is overflow, return MAX_INT.

    要求不使用乘法、除法或模运算实现: dividend/divisor,也就是只能用加、减或位运算。int的取值范围[-2147483648, 2147483647],即最小值的abs比最大值的abs大1,那么,除法却发生溢出的情况仅仅当:dividend=-2147483648,divisor=-1。此外要注意的是:Math.abs(-2147483648) = -2147483648,要避免这种情况

    public class Solution {
        public int divide(int dividend, int divisor) {
            
            if(divisor == 0) {
                return Integer.MAX_VALUE;
            }
            
            int result = 0;
            if(dividend == Integer.MIN_VALUE) {  
                if(divisor == -1) {
                    return Integer.MAX_VALUE;
                }
                dividend += Math.abs(divisor);   //之所以这么做是为了避免下面对dividend求abs时发生溢出
                result++;                        //经过上面一行的处理,此处result要记得加1
            }
            if(divisor == Integer.MIN_VALUE){    //当divisor为MIN时,结果要么为1(dividend也为MIN),要么为0
                return result;
            }
            
            boolean isNeg = (dividend^divisor)>>>31 ==1;  //用xor,并右移31位高位补0的方法来判断结果的正负
                                                          //乘法可能会溢出,且题目不让用,此外位运算效率高
            dividend = Math.abs(dividend);
            divisor = Math.abs(divisor);                  //经过上面的处理和判断,此处的abs运算肯定不会溢出
            
            
            //经过上面的处理,问题变成两个正整数的除,且不会溢出
            //思路是任一个数可以表示成以2的幂为底的一组基的线性组合,num=a_0*2^0+a_1*2^1+a_2*2^2+...+a_n*2^n
            //且位运算中,左移相当于*2,右移相当于/2
            //先让除数左移直到大于被除数之前得到一个最大的基,然后接下来每次尝试减去这个基,
            //如果可以则结果增加加2^k,然后基继续右移迭代,直到基为0为止
            int digit = 0;                     //标记移了多少位
            while(divisor <= (dividend>>1)) {
                divisor <<= 1;
                digit++; 
            }
            
            while(digit>=0) {
                if(dividend >= divisor){
                    result += 1<<digit;  
                    dividend -= divisor;  
                }
                divisor >>= 1; 
                digit--; 
            }
            
            return isNeg ? -result : result;
        }
    }



  • 相关阅读:
    flex 均分铺满
    git commit -a -m "M 1、引入mixin,公共样式mixin传参处理;";git push origin master:master
    mixin 在传参中可以出现 参数 在类内部可以定义 作用域
    p:nth-last-child(2)
    display block 是否提倡
    对宽度的控制原则 git commit -a -m "M 1、完成less计算得出图片的均分布局;";git push origin master:master
    体验评分 小程序 优化
    tmp
    after
    通过less 计算 得出图片均分布局
  • 原文地址:https://www.cnblogs.com/dosmile/p/6444430.html
Copyright © 2011-2022 走看看