diff --git a/problems/number-of-digit-one/number_of_digit_one.go b/problems/number-of-digit-one/number_of_digit_one.go index 800a3e308..c6edca3eb 100644 --- a/problems/number-of-digit-one/number_of_digit_one.go +++ b/problems/number-of-digit-one/number_of_digit_one.go @@ -1 +1,14 @@ -package number_of_digit_one +package problem_233 + +func countDigitOne(n int) int { + ans, b, x := 0, 1, 0 + for b <= n { + x = n / b + ans += (x + 8) / 10 * b + if x%10 == 1 { + ans += n%b + 1 + } + b *= 10 + } + return ans +} diff --git a/problems/number-of-digit-one/number_of_digit_one_test.go b/problems/number-of-digit-one/number_of_digit_one_test.go index 800a3e308..0b72bc0e4 100644 --- a/problems/number-of-digit-one/number_of_digit_one_test.go +++ b/problems/number-of-digit-one/number_of_digit_one_test.go @@ -1 +1,67 @@ -package number_of_digit_one +package problem_233 + +import "testing" + +type caseType struct { + input int + expected int +} + +func TestCountDigitOne(t *testing.T) { + tests := [...]caseType{ + { + input: 0, + expected: 0, + }, + { + input: 1, + expected: 1, + }, + { + input: 12, + expected: 5, + }, + { + input: 99, + expected: 20, + }, + { + input: 100, + expected: 21, + }, + { + input: 123, + expected: 57, + }, + { + input: 1234, + expected: 689, + }, + { + input: 12345, + expected: 8121, + }, + { + input: 123456, + expected: 93553, + }, + { + input: 1234567, + expected: 1058985, + }, + { + input: 12345678, + expected: 11824417, + }, + { + input: 123456789, + expected: 130589849, + }, + } + for _, tc := range tests { + output := countDigitOne(tc.input) + if output != tc.expected { + t.Fatalf("input: %v, output: %v, expected: %v", tc.input, output, tc.expected) + } + } +}