Do you ever meet the question to sum all digits from the input, for example given 112
so the sum of the number is 4
.
Naïve approach is to convert to string, then read character one by one. Typecast to integer, then sum all data. The simple ways to typecast rune to int using int(r - ‘0’)
.
func Solution1(n int) int {
sum := 0
for _, r := range fmt.Sprintf(“%d”, n) {
sum += int(r - ‘0’)
}
return sum
}
Another way is to use an arithmetic approach by utilizing mod and division. Here are the example codes:
func Solution2(n int) int {
sum := 0
for n > 0 {
digit := n % 10
sum += digit
n /= 10
}
return sum
}
So which one to use? Let’s see the benchmark result first.
go test -bench=Sum -benchmem -shuffle=on
-test.shuffle 1673764987422236824
goos: linux
goarch: amd64
pkg: github.com/h4ckm03d/golang-playground/6-practical-benchmark
cpu: AMD Ryzen 7 5800H with Radeon Graphics
BenchmarkSolution2-4 241413471 5.342 ns/op 0 B/op 0 allocs/op
BenchmarkSolution1-4 14215688 84.96 ns/op 16 B/op 1 allocs/op
PASS
ok github.com/h4ckm03d/golang-playground/6-practical-benchmark 3.091s
The result of the benchmark Solution2 outclass Solution1 and even 0 allocation. If you encounter the similar problem to do any logic with digit from given integer, you can use the Solution2
approach to avoid time limit platform.