Leetcode29. 两数相除
题目:
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231,231−1][−2^{31}, 2^{31} − 1][−231,231−1]。本题中,如果除法结果溢出,则返回 231−12^{31} − 1231−1。
题解:
不能一点点相减,效率太低,考虑倍减:如2147483647/2》》除以2,4,8,16……不能倍增就从2再开始。
scala代码:
def divide(dividend: Int, divisor: Int): Int = {
var negtive = 0
//判断是否是Int.MinValue
var flag = 0
var dividend1 = dividend
var divisor1 = divisor
if (dividend1 == Int.MinValue && divisor1 == -1) Int.MaxValue
if (dividend1 == Int.MinValue && divisor1 == 1) Int.MinValue
//如果dividend1是最小值,flag=1
if (dividend1 == -2147483648) {
dividend1 = 2147483647
flag = 1
}
if (dividend1 < 0) {
dividend1 = -dividend1
negtive = -1
}
if (divisor1 < 0) {
divisor1 = -divisor1
negtive = -1
}
//最终结果
var ret = 0
//除数的多少倍
var count = 1
//当前除数
var divisorTmp = divisor
//不能一点点相减,效率太低,考虑倍减:如2147483647/2》》除以2,4,8,16……不能倍增就从2再开始
while (dividend1 - divisor1 >= 0) {
ret = ret + count
dividend1 = dividend1 - divisorTmp
if (dividend1 > divisorTmp + divisorTmp) {
//倍数翻倍
count = count + count
//除数翻倍
divisorTmp = divisorTmp + divisorTmp
} else {
count = 1
divisorTmp= divisor1
}
}
//消除被除数+1的影响,如最后剩3/4,就需要把结果+1
if (flag == 1) {
val s = if (dividend1 + 1 == divisor1) 1 else 0
ret = ret + s
}
if (negtive == 0) ret else -ret //正负判断
}
本文详细解析了LeetCode第29题“两数相除”的算法实现,不使用乘法、除法和模运算符完成除法运算,通过倍减策略提高效率,适用于32位有符号整数运算。
1037

被折叠的 条评论
为什么被折叠?



