This problem asks to write a program that translates a number between 1 and 30 to count and say
. This means that starting with 1, we need to find the next number which is the count of any consecutive duplicate integers and the number itself. So we use the last number to find the next. Let me try to explain it more visually:
- 1
- 11
- 21
- 1211
- 111221
- 312211
- 13112221
- 1113213211
- 31131211131221
- 13211311123113112211
Since 4 is 1211
, 5 is 111221
so digit by digit:
-
1
-> 11 (one ones) -
2
-> 12 (one twos) so far: 1112 -
11
-> 21 (two ones) final: 111221
Code
Taking a look at the algorithm:
let countAndSay = (n) => {
let result = '1'
for(let i = 1; i < n ; i++){
let consecutiveDigits = ''
let substringResult = ''
for(let j = 0; j < result.length; j++){
consecutiveDigits += result[j]
if(result[j] !== result[j+1]){
substringResult += `${sameDigits.length}${sameDigits[0]}`
consecutiveDigits = ''
}
}
result = substringResult
}
return result
};
We start the count at 1 as a string (let result = '1'
), then set an empty string that will track the consecutive digits (let consecutiveDigits = ''
) and if there are duplicates we add them (consecutiveDigits += result[j]
).
When the next number is different (if(result[j] !== result[j+1])
) we count the current duplicates (consecutiveDigits.length
) and add the current number (consecutiveDigits[0]
).
Both values are added as substrings in the inner loop (substringResult
) and this is set to result
on the outer loop.
After the inner loop iteration is finished we set the result variable to the substrings we have collected.
The outer loop goes on until we reach the desired number to translate to count and say
and stores the previous number. While the inner loop goes analyses the previous count and say
number to generate the next number.
Top comments (0)