Back to all solutions

#481 - Magical String

Problem Description

A magical string s consists of only '1' and '2' and obeys the following rules:

  • The string s is magical because concatenating the number of contiguous occurrences of characters '1' and '2' generates the string s itself.
  • The first few elements of s is s = "1221121221221121122……". If we group the consecutive 1's and 2's in s, it will be "1 22 11 2 1 22 1 22 11 2 11 22 ......" and the occurrences of 1's or 2's in each group are "1 2 2 1 1 2 1 2 2 1 2 2 ......". You can see that the occurrence sequence is s itself.

Given an integer n, return the number of 1's in the first n number in the magical string s.

Solution

/**
 * @param {number} n
 * @return {number}
 */
var magicalString = function(n) {
  if (n <= 0) return 0;
  if (n <= 3) return 1;

  const stack = [1, 2, 2];
  let result = 1;

  for (let i = 2, num = 1; stack.length < n; i++) {
    for (let j = 0; j < stack[i]; j++) {
      stack.push(num);
      if (num === 1 && stack.length <= n) {
        result++;
      }
    }
    num = num === 1 ? 2 : 1;
  }

  return result;
};