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

    Divide Two Integers

    问题:

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

    If it is overflow, return MAX_INT.

    思路:

      二分查找

    我的代码:

    public class Solution {
       public int divide(int dividend, int divisor) {
            if(divisor == 0) return Integer.MAX_VALUE;
            if(dividend == 0) return 0;
            boolean flag = true;
            if((dividend < 0 && divisor > 0)||(dividend > 0 && divisor < 0))
            {
                flag = false;
            }
            long top = Math.abs((long)dividend);
            long down = Math.abs((long)divisor);
            long[] rst = helper(top, down);
            long result = (flag ? rst[0] : -rst[0]);
            if(result > Integer.MAX_VALUE || result < Integer.MIN_VALUE)    return Integer.MAX_VALUE;
            return (int)result ;
        }
        public long[] helper(long dividend, long divisor)
        {
            long[] rst = new long[2];
            if(dividend == divisor)
            {
                rst[0] = 1;
                rst[1] = 0;
                return rst;
            }
            if(dividend < divisor)
            {
                rst[0] = 0;
                rst[1] = dividend;
                return rst;
            }
            long mid = dividend >> 1;
            
            rst = helper(mid, divisor);
            long remain = dividend - (mid << 1) + (rst[1] <<1);
            if(remain >= divisor)
            {
                rst[0] = (rst[0]<<1) + 1;
                rst[1] = remain - divisor;
            }
            else
            {
                rst[0] = (rst[0]<<1);
                rst[1] = remain;
            }
            return rst;
        }
    }
    View Code

    他人代码:

    public int divide(int dividend, int divisor) {
            long a = Math.abs((long)dividend);
            long b = Math.abs((long)divisor);
            
            long ret = 0;
            
            while (a >= b) {
                for (long tmp = b, cnt = 1; a >= tmp; tmp <<= 1, cnt <<= 1) {
                    ret += cnt;
                    a -= tmp;
                }
            }
            
            ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret;
            if (ret > Integer.MAX_VALUE || ret < Integer.MIN_VALUE) {
                return Integer.MAX_VALUE;
            }
            
            return (int)ret;
        }
    View Code

    学习之处:

    • 判断两个数相乘是否为负数, ret = (((dividend ^ divisor) >> 31) & 1) == 1 ? -ret: ret; 这个方法真简洁
    • 我的代码太过于臃肿,看看别人的代码是如此的简介,我的代码可取之处只是思路更加清晰一点而已
    • 既然不能用乘除法,还可以用移位操作嘛
  • 相关阅读:
    第07组 Alpha冲刺 (2/6)
    第07组Alpha冲刺(1/6)
    第四次作业
    面试题练习
    SpringMVC访问静态资源
    MyBatis基础
    Spring注解和jdk注解
    自动代理生成器
    aspect xml
    Spring-案例
  • 原文地址:https://www.cnblogs.com/sunshisonghit/p/4386307.html
Copyright © 2011-2022 走看看