题目描述
题目:输入两个表示二进制的字符串,请计算它们的和,并以二进制字符串的形式输出。例如,输入的二进制字符串分别是"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()
}
}