1. 题目
给你两个二进制字符串,返回它们的和(用二进制表示)。
输入为 非空 字符串且只包含数字 1 和 0。
示例 1:
输入: a = “11”, b = “1”
输出: “100”
示例 2:
输入: a = “1010”, b = “1011”
输出: “10101”
2. 思路
直接计算二进制相加,大于2就进位
因为两个数字可能长度不一样,所以先反过来计算,然后再把结果反过来,就是最后的结果
例如:
1010 + 110,计算如下
1010
+100
可以写成,正常是从右往左计算,进位往左:
1010
+0100
-------
1110
反过来计算,从左往右计算,进位往右:
0101
+0010
-------
0111
最后结果再反过来:
1110
3. 代码
class facebook05 {
func addBinary(_ a: String, _ b: String) -> String {
let arr1 = Array(a).reversed().map({Int(String($0))!})
let arr2 = Array(b).reversed().map({Int(String($0))!})
let maxCnt = max(arr1.count, arr2.count)
var res = "", carry = 0
for i in 0..<maxCnt {
let s1 = i < arr1.count ? arr1[i] : 0
let s2 = i < arr2.count ? arr2[i] : 0
let tempSum = s1 + s2 + carry
let str = tempSum > 1 ? tempSum - 2 : tempSum
carry = tempSum > 1 ? 1 : 0
res += String(str)
}
if carry == 1 {
res += String(1)
}
return String(res.reversed())
}
}