题目:输入两个 Int32 的整型数,返回两数的商,要求不得使用乘号、除号和求余符号。当发生溢出时,返回最大的整数值。
Tips:除数不得为 0。
结题思路:
- 因为题目限定了运算符,所以我们可以用加减运算来实现。
- 只存在一种情况会发生溢出,即 除以 -1,结果为 。而 Int32 的最大值是 - 1。
- 如果循环每次减去除数,时间复杂度为O(n)。我们可以判断它的倍数将时间复杂度优化为 O(logn)。
- 关于正负数,可以统一转为负数,记一个结果的正负号标记。等得到计算结果后,根据标记再调整结果的正负号。
Swift 示例代码如下:
func divide(_ dividend: Int, _ divisor: Int) -> Int {
// 如果溢出则返回最大值
if dividend == Int32.min && divisor == -1 {
return Int(Int32.max)
}
// 当除数或被除数同时为正数或同时为负数,结果应为正数。
let resultIsPositive = (dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)
// 将除数和被除数转为负数
var dividend = dividend < 0 ? dividend : -dividend
let divisor = divisor < 0 ? divisor : -divisor
var result = 0
// 因为都转成了负数,所以这里应该是小于等于
while dividend <= divisor {
var addCount = 1
var sum = divisor + divisor
// 内循环是找到当前最大的倍数
while dividend <= sum {
sum += divisor
addCount += 1
}
dividend = dividend + divisor - sum
result += addCount
}
// 根据 resultIsPositive 来调整正负号
result = resultIsPositive ? result : -result
return result
}