Each day I solve several coding challenges and puzzles from Codr's ranked mode. The goal is to reach genius rank, along the way I explain how I solve them. You do not need any programming background to get started, and you will learn a ton of new and interesting things as you go.
Here's our second challenge on the advanced level:
function mode(x) {
let counts = {};
let mode = [];
let max = 0;
let n = x.length;
let i = -1;
let d, k;
while (++i < n) {
d = x[i]
if (d in counts)
k = ++counts[d];
else
k = counts[d] = 1;
if (k === max)
mode.push(d);
else if (k > max) {
max = k;
mode = [d];
}
}
return mode;
}
let inp = [2,4,8,8,2,2]
let out = mode(inp)
let A = out.length
// A = ? (number)
We need to determine the value of A
, which is the size of the array out
, which is the output of the function mode
.
If you briefly analyze this function, you are unlikely to recognize it, unless you explicitly wrote something very similar in the past. The name of the function mode
is a well-known operation in statistics for determining the most occurring numbers in a set. In other words, the mode of a set of numbers is the number with the highest frequency.
What this function basically does is keep track of the most occurring numbers, these are stored in the internal array mode
, do not confuse it with the function mode
.
The while-loop iterates over each number in the input array x
, each element is assigned to variable d
. The first if-else statement keeps track of all the numbers as a key-value object; whereby variable k
is the number of occurrences of the number d
.
The second if-else checks if k
is greater than the current highest occurring number (i.e. its frequency). It uses the variable max
to keep track of the highest frequency. If k == max
then d
is added to the mode
array. Because it's among the highest occurring numbers up to that point.
Else if k > max
; meaning the number d
has a higher frequency than all the numbers in mode
, then it overrides max
with k
, and mode
becomes a new array with d
as the first number.
Let's put this all in pseudo-code:
x = [2, 4, 8, 8, 2, 2]
mode = []
max = 0
-> d = 2
k = 1
max = 1
mode = [2]
-> d = 4
k = 1
max = 1
mode = [2, 4]
-> d = 8
k = 1
max = 1
mode = [2, 4, 8]
-> d = 8
k = 2
max = 2
mode = [8]
-> d = 2
k = 2
max = 2
mode = [8, 2]
-> d = 2
k = 3
max = 3
mode = [2]
return mode;
--> out = mode(x) = [2]
A = out.length = 1
By solving these challenges you train yourself to be a better programmer. You'll learn newer and better ways of analyzing, debugging and improving code. As a result you'll be more productive and valuable in business. Join me on the Road to Genius and upgrade your programming skills, at https://nevolin.be/codr/
Top comments (0)