Count and Say
Description
The count-and-say sequence is the sequence of integers with the first five terms as following:
1. 1 2. 11 3. 21 4. 1211 5. 111221
1
is read off as "one 1"
or 11
.
11
is read off as "two 1s"
or 21
.
21
is read off as "one 2
, then one 1"
or 1211
.
Given an integer n where 1 ≤ n ≤ 30, generate the nth term of the count-and-say sequence. You can do so recursively, in other words from the previous member read off the digits, counting the number of digits in groups of the same digit.
Note: Each term of the sequence of integers will be represented as a string.
Example 1:
Input: 1 Output: "1" Explanation: This is the base case.
Example 2:
Input: 4 Output: "1211" Explanation: For n = 3 the term was "21" in which we have two groups "2" and "1", "2" can be read as "12" which means frequency = 1 and value = 2, the same way "1" is read as "11", so the answer is the concatenation of "12" and "11" which is "1211".
Solution(javascript)
/**
* @param {number} n
* @return {string}
*/
var countAndSay = function(n) {
function next(si, n){
if(n === 1) {
return si;
}
let so = '';
let ar = [];
let id = 0;
let mp = new Map();
let lc = '0';
for(let i = 0; i < si.length; i++){
const ch = si.charAt(i);
if(ch != lc){
ar.push(id);
mp.set(id, new Map([[ch, {val: 1}]]));
id += 1;
} else {
mp.get(id-1).get(ch).val++;
}
lc = ch;
}
for(let i = 0; i < ar.length; i++){
mp.get(ar[i]).forEach(function(v, k){
so += (v.val + k);
});
}
return next(so, n-1);
}
return next('1', n);
};