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

时间复杂度\(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;
}
}

浙公网安备 33010602011771号