67. 二進位制求和
給定兩個二進位制字串,返回他們的和(用二進位制表示)。
輸入為非空字串且只包含數字 1 和 0。
示例 1:
輸入: a = "11", b = "1"
輸出: "100"
示例 2:
輸入: a = "1010", b = "1011"
輸出: "10101"
碰到這個題目的第一個思路,轉換為十進位制求和,剛剛好熟悉一下 golang strconv 庫
func addBinary(a string, b string) string { ai, err := strconv.ParseInt(a, 2, 64) if err != nil { fmt.Println(ai, err) } bi, err := strconv.ParseInt(b, 2, 64) return fmt.Sprintf("%b", ai+bi) }
不出意外,提交不通過,不通過的測試為
c := "10100000100100110110010000010101111011011001101110111111111101000000101111001110001111100001101"d := "110101001011101110001111100110001010100001101011101010000011011011001011101111001100000011011110011"
這個測試的想法當然是讓我們自己算了,ok,沒有問題,計算二進位制加法很簡單,定義一個二進位制加法函式(記得考慮進位)
func binadd(x, y, flag int) (sum, addflag int) { sum = (x + y + flag) % 2 addflag = (x + y + flag) / 2 return }
好吧,為了配合輸入輸出是字串,還需要轉換一下
func binStr2Slice(BinStr string) []int { temp := make([]int, len(BinStr), len(BinStr)) for i := 0; i < len(BinStr); i++ { if BinStr[i] == '0' { temp[i] = 0 } else { temp[i] = 1 } } return temp } func binSlice2str(b []int) string { s := "" for _, v := range b { s = s + fmt.Sprint(v) } return s }
addBinary 需要一個遍歷的過程
func addBinaryS(a string, b string) string { if len(a) < len(b) { a, b = b, a } maxL := len(a) aint := binStr2Slice(a) bint := binStr2Slice(b) addFlag := 0 sum := make([]int, maxL, maxL) for i := 1; i <= maxL; i++ { if i <= len(b) { sum[len(sum)-i], addFlag = binadd(aint[len(aint)-i], bint[len(bint)-i], addFlag) } else { sum[len(sum)-i], addFlag = binadd(aint[len(aint)-i], 0, addFlag) } } if addFlag == 1 { sum = append([]int{1}, sum...) } return binSlice2str(sum) }
PASS
附上0ms通過的程式碼,裡面使用了字元加減的設計,個人感覺不是很好理解,所以不做分析
func addBinary(a string, b string) string { var carry, sum int i, j := len(a), len(b) if i < j { i, j = j, i a, b = b, a } res := make([]byte, i+1) for j > 0 { j-- i-- sum = int(a[i]-'0') + int(b[j]-'0') + carry carry = sum / 2 sum = sum % 2 res[i+1] = byte(sum + '0') } for i > 0 { i-- sum = int(a[i]-'0') + carry carry = sum / 2 sum = sum % 2 res[i+1] = byte(sum + '0') } res[0] = byte(carry + '0') for i < len(res)-1 { if res[i] == '0' { i++ } else { break } } return string(res[i:]) }