來源:力扣(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 運算符還能怎么優化。先這樣吧。
image.png