鲁迅说过,人生最大的快乐就在不断的求知,不断地进步,在刷 LeetCode 的过程中强化自己的基础知识,二哥的 LeetCode 刷题笔记正给了我这样进步的快乐。
题意
给你两个整数,被除数 dividend
和除数 divisor
。将两数相除,要求不使用乘法、除法和取余运算。
整数除法应该向零截断,也就是截去(truncate)其小数部分。例如,8.345 将被截断为 8 ,-2.7335 将被截断至 -2 。
返回被除数 dividend
除以除数 divisor
得到的商。
注意:假设我们的环境只能存储 32 位 有符号整数,其数值范围是 $[−2^{31}, 2^{31} − 1]$ 。本题中,如果商严格大于 $2^{31} − 1$ ,则返回 $2^{31} − 1$ ;如果商 严格小于 $-2^{31}$ ,则返回 $-2^{31}$ 。
难度
中等
示例
输入: dividend = 10, divisor = 3
输出: 3
解释: 10/3 = 3.33333.. ,向零截断后得到 3 。
输入: dividend = 7, divisor = -3
输出: -2
解释: 7/-3 = -2.33333.. ,向零截断后得到 -2 。
分析 1
题目要求不能用除法(/),也不能用乘法(*),还有 “取余(%)”,如果我们偏要用除法会怎么样呢?
class Solution {
public int divide(int dividend, int divisor) {
// 直接使用除法计算结果
long result = (long) dividend / divisor;
// 处理溢出情况
if (result > Integer.MAX_VALUE) {
return Integer.MAX_VALUE;
}
if (result < Integer.MIN_VALUE) {
return Integer.MIN_VALUE;
}
return (int) result;
}
}
来看一下运行结果:
竟然也击败了 100% 的用户,哈哈哈 😂
其实有时候我们真解不出来的话,多多少少先把答案写上去,至于能不能得分,再说呗。
分析 2
题目要求不能用除法,不过我们处理溢出情况的写法,后面还是要用到的,尤其是 (long) dividend
这个强转的处理,其实就考察了基本数据类型的转换问题,包括最后返回的 (int) result
,都是很细节的问题,但却很重要。
那既然不能用除法,我们应该怎么去计算两数相除呢?
用减法。
除法基本上是减法的逆运算,它表示将一个数(被除数)分成几个相等的部分(除数)时,可以得到多少个这样的部分(商)。如果用减法来实现除法,本质上是在问:“我可以从被除数中减去多少次除数?”每减去一次,就相当于得到了一个单位的商。
假设我们要计算 dividend / divisor = quotient
(被除数 / 除数 = 商
),其中 dividend
和 divisor
是已知的,我们要找到 quotient
。
①、初始化计数器:设置一个计数器 count
,初始值为 0。这个计数器将用来记录我们能从被除数中减去多少次除数。
②、循环减除数:只要被除数 dividend
大于或等于除数 divisor
,就从被除数中减去除数,并且计数器 count
加一。
while (dividend >= divisor) {
dividend -= divisor;
count++;
}
③、处理剩余部分:当被除数小于除数时,循环结束。此时,count
的值就是整数除法的结果(商),而此时的 dividend
是除法的余数。
假设我们要计算 10 / 3
:
- 初始时,
dividend = 10
,divisor = 3
,count = 0
。 10 >= 3
,执行减法10 - 3 = 7
,count = 1
。7 >= 3
,再次执行减法7 - 3 = 4
,count = 2
。4 >= 3
,再次执行减法4 - 3 = 1
,count = 3
。- 此时,
1 < 3
,循环结束,count = 3
是商,1
是余数。
我们来试一下,直接用 ACM 的模式在 Intellij IDEA 中打印结果:
class Main02901 {
public static void main(String[] args) {
Solution02901 solution = new Solution02901();
System.out.println(solution.divide(10, 3));
System.out.println(solution.divide(7, -3));
System.out.println(solution.divide(0, 1));
System.out.println(solution.divide(1, 1));
System.out.println(solution.divide(1, 0));
System.out.println(solution.divide(-2147483648, -1));
}
}
class Solution02901 {
public int divide(int dividend, int divisor) {
// 处理特殊情况
if (dividend == Integer.MIN_VALUE && divisor == -1) {
return Integer.MAX_VALUE;
}
// 符号处理
boolean negative = (dividend < 0) ^ (divisor < 0);
long ldividend = Math.abs((long)dividend);
long ldivisor = Math.abs((long)divisor);
long result = 0;
while (ldividend >= ldivisor) {
ldividend -= ldivisor;
result+
真诚点赞 诚不我欺
回复