swift5二进制求和-leetcode

150 阅读1分钟

字符串方式求和

        let n = max(a.count, b.count)
        var carry = 0
        var result: String = ""
        for i in 0...n - 1 {
            if i < a.count {
                let aChar = a.getChar(index: a.count - 1 - i)
                carry += aChar.isNumber ? aChar.wholeNumberValue! : 0
            }
            if i < b.count {
                let bChar = b.getChar(index: b.count - 1 - i)
                carry += bChar.isNumber ? bChar.wholeNumberValue! : 0
            }
            result.insert(contentsOf: String(carry % 2), at: result.startIndex)
            carry /= 2
        }
        if carry > 0 {
            result.insert(contentsOf: "1", at: result.startIndex)
        }
        return result
        获取字符串中单个字符方法
        extension String {
        func getChar(index: Int) -> Character {
            let indexObj = self.index(startIndex, offsetBy: index)
            return self[indexObj]
        }
       }

数字形式求和(效率更高)

    let a = a.compactMap { Int(String($0)) }
    let b = b.compactMap { Int(String($0)) }
    
    var res = [Int]()
    
    var a_i = a.count - 1
    var b_i = b.count - 1
    
    var val = 0
    var carry = 0
    
    while a_i >= 0 || b_i >= 0 {
        
        val = 0
        if a_i >= 0 { val += a[a_i] }
        if b_i >= 0 { val += b[b_i] }
        val += carry
        
        res.append(val % 2)
        
        carry = val / 2
        
        a_i -= 1
        b_i -= 1
    }
    if carry != 0 { res.append(1) }
    return res.reversed().map { String($0) }.joined()