lc.002.二进制加法

剑指 Offer II 002. 二进制加法

Difficulty: **给定两个 01 字符串 a 和 b ,请计算它们的和,并以二进制字符串的形式输出。 输入为 非空 字符串且只包含数字 1 和 0。 示例 1: 输入: a = “11”, b = “10” 输出: “101” 示例 2: 输入: a = “1010”, b = “1011” 输出: “10101” 提示: 每个字符串仅由字符 ‘0’ 或 ‘1’ 组成。 1 <= a.length, b.length <= 10^4 字符串如果不是 “0” ,就都不含前导零。 注意:本题与主站 67 题相同:https://leetcode-cn.com/problems/add-binary/ **

给定两个 01 字符串 ab ,请计算它们的和,并以二进制字符串的形式输出。

输入为 非空 字符串且只包含数字 10

示例 1:

1
2
输入: a = "11", b = "10"
输出: "101"

示例 2:

1
2
输入: a = "1010", b = "1011"
输出: "10101"

提示:

  • 每个字符串仅由字符 '0''1' 组成。
  • 1 <= a.length, b.length <= 10^4
  • 字符串如果不是 "0" ,就都不含前导零。

注意:本题与主站 67 题相同:

Solution

Language: ****

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
func reverse(a []int) {
    var n  = len(a) 
    for i:=0;i< n>>1;i++ {
        a[i],a[n-i -1] = a[n-i-1],a[i]
    }
}
func reverse0(a []byte) {
    var n  = len(a) 
    for i:=0;i< n>>1;i++ {
        a[i],a[n-i -1] = a[n-i-1],a[i]
    }
}

func max(a ,b int) int{
    if a > b {
        return a 
    }
    return b
}
func addBinary(a string, b string) string {
    var s1 = make([]int,len(a))
    var s2 = make([]int,len(b))
    for i,v := range a {
        s1[i] = int(v-'0')
    }
    for i,v := range b {
        s2[i] = int(v-'0')
    }

    reverse(s1)
    reverse(s2)
    //var res []int 
   // var rest int 
    var n,m = len(s1),len(s2)
    // 
    s := strings.Builder{}
    var x = 0
    for i:=0;i<max(n,m);i++ {
        if i<n {
            x += s1[i]
        }
        if i<m {
            x += s2[i]
        }
        s.WriteRune( rune((x%2) + '0'))
        x /= 2
    }
    if x > 0 {
        s.WriteRune('1')
    }
    var res []byte
    res  = []byte(s.String())
    reverse0(res)
    return string(res)
}