Loading

LeetCode 29 两数相除

LeetCode29 两数相除

题目描述

给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。

返回被除数 dividend 除以除数 divisor 得到的商。

整数除法的结果应当截去(truncate)其小数部分,例如:truncate(8.345) = 8 以及 truncate(-2.7335) = -2

样例

输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = truncate(3.33333..) = truncate(3) = 3
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = truncate(-2.33333..) = -2

算法分析

二进制的思想

  • 保存b,2b,4b,8b,....2^n*b 中所有小于a的,保存在List中
  • 从List 的末端开始遍历,a>exo.get(i),说明大于,res+2^i

image-20201031144256038.png

时间复杂度\(O(log(a))\)

Java代码

class Solution {
    public int divide(int x, int y) {
        List<Long> exp = new ArrayList<Long>();
        long a = x;
        long b = y;

        boolean flag = false;
        if (a < 0 && b > 0 || a > 0 && b < 0) flag = true;
        

        if(a < 0) a = -a;
        if(b < 0) b = -b;

        for(long i = b; i <= a; i = i + i){
            exp.add(i);
            // b , 2b, .... 
        }

        long res = 0;
        for(int i = exp.size() - 1; i >=0 ; i--){
            if(a >= exp.get(i)){
                a -= exp.get(i);
                res += (long) 1 << i; // 2的i次方
            }
        }

        if(flag) res = -res;

        if(res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) res = Integer.MAX_VALUE;
        return (int)res;

    }
}
posted @ 2020-10-31 17:48  想用包子换论文  阅读(99)  评论(0)    收藏  举报