diff --git a/problems/add-binary/add_binary.go b/problems/add-binary/add_binary.go index 618b14970..1e5af18b8 100644 --- a/problems/add-binary/add_binary.go +++ b/problems/add-binary/add_binary.go @@ -1 +1,22 @@ package add_binary + +func addBinary(a string, b string) string { + i, j := len(a)-1, len(b)-1 + var carry byte = '0' + var bs []byte + for i >= 0 || j >= 0 || carry != '0' { + v := carry + if i >= 0 { + v += a[i] - '0' + i-- + } + if j >= 0 { + v += b[j] - '0' + j-- + } + carry = '0' + (v-'0')/2 + v = '0' + (v-'0')%2 + bs = append([]byte{v}, bs...) + } + return string(bs) +} diff --git a/problems/add-binary/add_binary_test.go b/problems/add-binary/add_binary_test.go index 618b14970..11adb7846 100644 --- a/problems/add-binary/add_binary_test.go +++ b/problems/add-binary/add_binary_test.go @@ -1 +1,35 @@ package add_binary + +import "testing" + +type caseType struct { + a string + b string + expected string +} + +func TestAddBinary(t *testing.T) { + tests := [...]caseType{ + { + a: "11", + b: "1", + expected: "100", + }, + { + a: "1010", + b: "1011", + expected: "10101", + }, + { + a: "111", + b: "111", + expected: "1110", + }, + } + for _, tc := range tests { + output := addBinary(tc.a, tc.b) + if output != tc.expected { + t.Fatalf("input: %v %v, output: %v, expected: %v", tc.a, tc.b, output, tc.expected) + } + } +}