Given two binary strings, return their sum (also a binary string).
The input strings are both non-empty and contains only characters 1
or 0
.
Example 1:
Input: a = "11", b = "1" Output: "100"
Example 2:
Input: a = "1010", b = "1011" Output: "10101"
给定两个二进制字符串,返回他们的和(用二进制表示)。
输入为非空字符串且只包含数字 1
和 0
。
示例 1:
输入: a = "11", b = "1" 输出: "100"
示例 2:
输入: a = "1010", b = "1011" 输出: "10101"
1 class Solution { 2 //从最低位加到最高位,当前位相加结果是%2,进位是/2, 3 //记得处理每一次的进位和最后一次的进位,最后反向输出字符。 4 func addBinary(_ a: String, _ b: String) -> String { 5 //存储字符的输出变量 6 var str:String = String() 7 //获取a的字符数量 8 var i:Int = a.count-1 9 //获取b的字符数量 10 var j:Int = b.count-1 11 //进位标志 12 var carry:Int = 0 13 while(i>=0 || j>=0) 14 { 15 var sum:Int = carry 16 if i>=0 17 { 18 //获取该索引的字符 19 var char:Character = a[a.index(a.startIndex, offsetBy: i)] 20 //将字符转换成整数 21 for code in char.unicodeScalars { 22 //字符 0 的ASCII码为48 23 sum += (Int(code.value) - 48) 24 } 25 //自减 26 i-=1 27 } 28 if j>=0 29 { 30 //获取该索引的字符 31 var char:Character = b[b.index(b.startIndex, offsetBy: j)] 32 //将字符转换成整数 33 for code in char.unicodeScalars { 34 //字符 0 的ASCII码为48 35 sum += (Int(code.value) - 48) 36 } 37 //自减 38 j-=1 39 } 40 //转换为临时字符串 41 var temp = String(sum % 2) 42 //追加到字符串末尾 43 str.append(temp[temp.startIndex]) 44 carry = sum/2 45 } 46 if carry != 0 47 { 48 //转换为临时字符串 49 var temp = String(carry) 50 //追加到字符串末尾 51 str.append(temp[temp.startIndex]) 52 } 53 //返回逆序字符串 54 return String(str.reversed()) 55 } 56 }
版本:16ms
1 class Solution { 2 func addBinary(_ a: String, _ b: String) -> String { 3 var reversedResult = "" 4 let aChars = Array(a), bChars = Array(b) 5 var aIndex = aChars.count - 1, bIndex = bChars.count - 1 6 var hasCarryOver = false 7 while aIndex >= 0 || bIndex >= 0 || hasCarryOver { 8 var sum = 0 9 if aIndex >= 0 && aChars[aIndex] == "1" { 10 sum += 1 11 } 12 if bIndex >= 0 && bChars[bIndex] == "1" { 13 sum += 1 14 } 15 if hasCarryOver { 16 sum += 1 17 } 18 reversedResult.append(String(sum % 2)) 19 hasCarryOver = sum > 1 20 aIndex -= 1 21 bIndex -= 1 22 } 23 return String(reversedResult.reversed()) 24 } 25 }
版本:20ms
1 class Solution { 2 func addBinary(_ a: String, _ b: String) -> String { 3 var str1 = Array(a) 4 var str2 = Array(b) 5 6 var result: [Character] = [] 7 8 var hasRemain = false 9 while !(str1.isEmpty) || !(str2.isEmpty) { 10 let first = str1.popLast() ?? "0" 11 let second = str2.popLast() ?? "0" 12 13 switch (first, second) { 14 case ("0", "0"): 15 result.append(hasRemain ? "1" : "0") 16 hasRemain = false 17 case ("0", "1"), ("1", "0"): 18 if hasRemain { 19 result.append("0") 20 } else { 21 result.append("1") 22 } 23 case ("1", "1"): 24 result.append(hasRemain ? "1" : "0") 25 hasRemain = true 26 default: break 27 } 28 } 29 30 if hasRemain { result.append("1") } 31 32 result = result.reversed() 33 return String(result) 34 } 35 }