来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/divide-two-integers
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题目
给定两个整数,被除数 dividend 和除数 divisor。将两数相除,要求不使用乘法、除法和 mod 运算符。
返回被除数 dividend 除以除数 divisor 得到的商。
示例 1:
输入: dividend = 10, divisor = 3
输出: 3
示例 2:
输入: dividend = 7, divisor = -3
输出: -2
说明:
被除数和除数均为 32 位有符号整数。
除数不为 0。
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。本题中,如果除法结果溢出,则返回 231 − 1。
方法-递归具体看getResult
func divide(_ dividend: Int, _ divisor: Int) -> Int {
if abs(dividend) < abs(divisor) {
return 0
}
let sign: Double = ((dividend > 0 && divisor > 0) || (dividend < 0 && divisor < 0)) ? 1 : -1
var result: Double = 0
if abs(divisor) == 1 {
result = sign * Double(abs(dividend))
if result > pow(2, 31) - 1 {
result = pow(2, 31) - 1
}else if result < -pow(2, 31) {
result = pow(2, 31)
}
return Int(result)
}
if abs(dividend) == abs(divisor) {
return Int(sign)
}
var newDividend = abs(dividend)
var newDivisor = abs(divisor)
result = Double(getResult(newDividend, newDivisor, Int(sign)))
if result > pow(2, 31) - 1
{
result = pow(2, 31) - 1
}else if result < -pow(2, 31) {
result = pow(2, 31)
}
return Int(result)
}
func getResult(_ dividend: Int, _ divisor: Int, _ sign: Int) -> Int {
var newDivisor = abs(divisor)
var result = 0
while newDivisor <= dividend {
if result == 0 {
result += sign
}else {
result += result
}
if (newDivisor + newDivisor) > dividend {
result += getResult(dividend - newDivisor, divisor, sign)
}
newDivisor += newDivisor
}
return result
}
之前 的方法都超时了,这个方法也只击败了70%的用户。但是我实在想不起来,不使用乘法、除法和 mod 运算符还能怎么优化。先这样吧。