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

你可能感兴趣的:(LeetCode算法题-29. 两数相除(Swift))