LeetCode 67 二进制求和

给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。

示例 1:

输入:a = "11", b = "1"
输出:"100"

示例 2:

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

提示:

  • 1 <= a.length, b.length <= 104
  • a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成
  • 字符串如果不是 “0” ,就不含前导零

解题:

func addBinary(a string, b string) string {
	la, lb := len(a), len(b)
	if la < lb {
		a, b = b, a
		la, lb = lb, la
	}
	flag := false
	s := ""
	for i := 0; i < la; i++ {
		k := int(a[la-i-1] - '0')
		if i < lb {
			k += int(b[lb-i-1] - '0')
		}
		if flag {
			k += 1
		}
		if k > 1 {
			flag = true
		} else {
			flag = false
		}
		s = strconv.Itoa(k%2) + s
	}
	if flag {
		s = "1" + s
	}
	return s
}

官方解答:

1.模拟

func addBinary(a string, b string) string {
	ans := ""
	carry := 0
	lenA, lenB := len(a), len(b)
	n := max(lenA, lenB)

	for i := 0; i < n; i++ {
		if i < lenA {
			carry += int(a[lenA-i-1] - '0')
		}
		if i < lenB {
			carry += int(b[lenB-i-1] - '0')
		}
		ans = strconv.Itoa(carry%2) + ans
		carry /= 2
	}
	if carry > 0 {
		ans = "1" + ans
	}
	return ans
}

func max(x, y int) int {
	if x > y {
		return x
	}
	return y
}

2.位运算

// 官方只有python代码,根据python写的go代码,a,b超过int64的最大值后就出错了
func addBinary(a string, b string) string {
	x, _ := strconv.ParseInt(a, 2, 64)
	y, _ := strconv.ParseInt(b, 2, 64)
	for y > 0 {
		answer := x ^ y
		carry := (x & y) << 1
		x, y = answer, carry
	}
	return strconv.FormatInt(x, 2)
}

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注