Magical String

medium string two pointers

Problem

The magical string s = "12211212212211...". Return the count of 1s in s[0..n-1].

Inputn = 6
Output3
"122112" has three 1s in the first 6 characters.

def magical_string(n):
    if n == 0: return 0
    s = [1, 2, 2]
    p = 2
    while len(s) < n:
        nxt = 3 - s[-1]
        for _ in range(s[p]):
            s.append(nxt)
        p += 1
    return s[:n].count(1)
function magicalString(n) {
  if (n === 0) return 0;
  const s = [1, 2, 2];
  let p = 2;
  while (s.length < n) {
    const nxt = 3 - s[s.length - 1];
    for (let i = 0; i < s[p]; i++) s.push(nxt);
    p++;
  }
  return s.slice(0, n).filter(x => x === 1).length;
}
class Solution {
    public int magicalString(int n) {
        if (n == 0) return 0;
        List s = new ArrayList<>(Arrays.asList(1, 2, 2));
        int p = 2;
        while (s.size() < n) {
            int nxt = 3 - s.get(s.size() - 1);
            for (int i = 0; i < s.get(p); i++) s.add(nxt);
            p++;
        }
        int c = 0;
        for (int i = 0; i < n; i++) if (s.get(i) == 1) c++;
        return c;
    }
}
int magicalString(int n) {
    if (n == 0) return 0;
    vector s = {1, 2, 2};
    int p = 2;
    while ((int)s.size() < n) {
        int nxt = 3 - s.back();
        for (int i = 0; i < s[p]; i++) s.push_back(nxt);
        p++;
    }
    int c = 0;
    for (int i = 0; i < n; i++) if (s[i] == 1) c++;
    return c;
}
Time: O(n) Space: O(n)