LeetCode算法題-29. 兩數相除(Swift)

來源:力扣(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
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容