鲁迅说过,人生最大的快乐就在不断的求知,不断地进步,在刷 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。
真诚点赞 诚不我欺
回复