leetcode做题记录0029

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;
    }
}
发布了77 篇原创文章 · 获赞 1 · 访问量 2068

猜你喜欢

转载自blog.csdn.net/Paul_1i/article/details/104538166