A magical string s consists of only '1' and '2' and obeys the following rules:
- The string
sis magical because concatenating the number of contiguous occurrences of characters'1'and'2'generates the stringsitself.
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.
Example 1
Input: n = 6
Output: 3
Explanation: The first 6 elements of magical string s is "122112" and it contains three 1's, so return 3.
Example 2
Input: n = 1
Output: 1
Constraints
- 1 <= n <= 1e5
Solution
原字符串与字符串组内出现连续字符次数组成的序列一致。
i 指向由组数构成序列中的当前生成数字的组数,赋给 size 来记录 j 要生成多少个字符
j 指向生成序列的当前元素,根据进入循环前的字符与其不同来确定当前字符 num
class Solution {
public:
int magicalString(int n) {
if (n < 4) return 1;
string s (n, '0');
s[0] = '1'; s[1] = '2'; s[2] = '2';
int i, j, ans;
i = 2; j = 3; ans = 1;
while (j < n) {
int size = s[i] - '0';
int num = 3 - (s[j - 1] - '0');
while (size > 0 && j < n) {
s[j] = num + '0';
if (num == 1) ans++;
size--;
j++;
}
i++;
}
return ans;
}
};