leetcode 0029
说明
只是为了记录一下,不求多快,也不深究。
会简要描述思路,代码中不写注释。
如碰到不会做的用了别人代码会在博客中标出。
题目描述
参考
参考B站up:程序员刀刀 的讲解。
链接如下:
力扣题目29-两数相除
思路
本来想除数一个一个加上去,看什么时候超过被除数,但是这样通不过,超出时间限制了,就去B站找答案了。
答案还是优秀啊,创建一个列表,里面放着一倍的除数、两倍的除数、四倍的除数、八倍的除数……
直到n倍的除数,这个数小于等于被除数。
然后用这个列表里的数从大到小组合被除数,直到超出被除数。
有点秀。
class Solution {
public int divide(int dividend, int divisor) {
if (dividend == 0) {
return 0;
}
long d1 = dividend;
long d2 = divisor;
if (d1 < 0) {
d1 = -d1;
}
if (d2 < 0) {
d2 = -d2;
}
List<Long> ls1 = new ArrayList<Long>();
List<Long> ls2 = new ArrayList<Long>();
long curr = d2;
long counts = 1;
while (curr <= d1) {
ls1.add(curr);
ls2.add(counts);
curr += curr;
counts += counts;
}
long res = 0;
for (int i = ls1.size() - 1; i >= 0; --i) {
if (ls1.get(i) <= d1) {
res += ls2.get(i);
d1 -= ls1.get(i);
}
}
if ((dividend < 0 && divisor > 0) || (dividend > 0 && divisor < 0)) {
res = -res;
}
if (res > Integer.MAX_VALUE || res < Integer.MIN_VALUE) {
return Integer.MAX_VALUE;
}
return (int) res;
}
}