剑指 - 二进制加法(Swift)

95 阅读1分钟

题目描述

题目:输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是"11"和"10",则输出"101"。

解题思路

  • 异常情况:任意一字符串为空,直接返回另一字符串。都为空则返回空字符串。
  • 将两个字符串转为字符串数组,方便计算
  • 从数组尾部开始进行计算,存储进位。
  • 循环条件为任意数组不为空则进循环。
  • 每次循环计算sum 和 carry。sum 大于等于 2 则 carry 为 1,sum 置为 sum - 2,sum 等于 1 或 0 则carry 为 0,sum 无变化。
  • 每次计算结果依次添加到结果数组中。
  • 循环完需判断 carry 是否为 1,为 1 则需在结果尾部1。
  • 因为结果数组是从低位到高位存储每次的计算结果的,所以最后需要逆序成字符串输出。

代码实现

class Solution {
    func addBinary(_ a: String, _ b: String) -> String {
        if a.isEmpty && b.isEmpty { return "" }
        if a.isEmpty { return b }
        if b.isEmpty { return a }
        
        var bin1Arr = Array(a)
        var bin2Arr = Array(b)
        
        var carry = 0
        var result = [Int]()
        
        while !bin1Arr.isEmpty || !bin2Arr.isEmpty {
            let bin1 = bin1Arr.isEmpty ? 0 : Int(String(bin1Arr.popLast()!))!
            let bin2 = bin2Arr.isEmpty ? 0 : Int(String(bin2Arr.popLast()!))!
            var sum = bin1 + bin2 + carry
            carry = (sum >= 2) ? 1 : 0
            sum = (sum >= 2) ? sum - 2 : sum
            result.append(sum)
        }
        
        if carry == 1 {
            result.append(1)
        }
        
        return result.reversed().map{String($0)}.joined()
    }
}