67. 二进制求和

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 }
复制代码

猜你喜欢

转载自www.cnblogs.com/strengthen/p/9697968.html