This post is a little bit different from the last ones. Days 1-12 followed more or less strictly what HackerRank 30 days of code Tutorial had, but starting on day 13 there was a series of challenges that didn’t allow me to use Go. They are more specific to object-oriented languages like C++ and Java. As Go doesn’t have all the constructions these languages allow, like abstract classes, at least not without a workaround, I decided to take other challenges on HackerRank. The one for today is about statistics and I will introduce some of the concepts before showing the code solution.
Statistics: Mean, Median and Mode
These simple statistics concepts can be easily learned at Wikipedia, but I will do a quick recap here using my own words considering an array of numbers.
- Mean - considering an array of numbers, the mean is the sum of the components divided by the length of the array: $\mu(\mathbf{x}) = \frac{1}{n}\sum_{i=1}^n x_i$. Example: the mean of $1,; 2,; 3,; 3,; 4,; 5,; 5$ is $\frac{23} {7}\approx 3.286$.
- Median - the number in the middle of the array. There is a catch if the array has an even number of elements. In this case, the average of the two middle elements is taken. Example: $1,; 2,; 3,; 3,; 4,; 5,; 5$ has median 3 and $1,; 2,; 3,; 3,; 4,; 5,; 5,; 5$ has median 3.5.
- Mode - the most frequent number that appears in the array. There can be many modes if there are many numbers that appear with the same frequency. Example: $1,; 2,; 3,; 3,; 4,; 5,; 5$ has modes 3 and 5 while $1,; 2,; 3,; 3,; 4,; 5,; 5,; 5$ has a single mode which is 5.
Problem description and code
This problem requires the program to read an int n
indicating the number of
integer elements that will be read later as part of our array. After reading the
data, it should print the mean, median and mode on the screen, each one on one
line. My solution is presented now.
package main
import (
"fmt"
"sort"
)
// no actual need for that
// but it is good to encapsulate
// data to return in the function
type Stats struct {
mean float64
median float64
mode int
}
// Returns smallest mode of array
func GetMode(array []int) int {
mode := 0
occurrences := 0
currentValue := array[0]
currentOccurrences := 0
n := len(array)
for i := 0; i < n; i++ {
if array[i] != currentValue {
if currentOccurrences > occurrences {
mode = currentValue
occurrences = currentOccurrences
}
currentOccurrences = 1
currentValue = array[i]
} else {
currentOccurrences++
}
}
return mode
}
func GetStats(array []int) *Stats {
sum := 0.0
n := len(array)
// sorting for median and mode
sort.Ints(array)
for i := 0; i < n; i++ {
sum += float64(array[i])
}
mean := sum / float64(n)
median := float64(array[n/2]+array[n/2-1]) / 2.0
if n%2 == 1 {
median = float64(array[n/2])
}
mode := GetMode(array)
stats := new(Stats)
stats.mean = mean
stats.median = median
stats.mode = mode
return stats
}
func main() {
var N int
var array []int
fmt.Scanf("%d", &N)
array = make([]int, N)
for i := 0; i < N; i++ {
fmt.Scanf("%d", &array[i])
}
answer := GetStats(array)
fmt.Printf("%.1f\n", answer.mean)
fmt.Printf("%.1f\n", answer.median)
fmt.Printf("%d\n", answer.mode)
}
One of the things that took me some time was figuring out how to do sorting
properly. I tried to use sort.Sort
first but I was just getting lots of
compiler errors saying the int array didn’t implement the sort.Interface
. It
was really frustrating. Luckly I found an
example quickly.
If you have any doubts or comments, please do!