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 Sitself.
The first few elements of string S is the following: 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 above is the S itself.
Given an integer N as input, return the number of '1's in the first N number in the magical string S.
思路:
不断生成这个字符串的新内容,例如:
1 2 2
^ ^
| value pointer
generate prointer
现在generate pointer指向2,value pointer之前的值是2,所以插入两个2。
题解:
int magicalString(int n) {
if (n == 0) return 0;
std::string magical{true, false, false};
int num1s = 1;
int countIter = 3;
int generateIter = 2;
bool flagValue = true;
while(countIter < n) {
bool numGenerateValues = magical[generateIter++];
magical.push_back(flagValue);
++countIter;
num1s += flagValue;
if (countIter >= n) break;
if (numGenerateValues == false) { // false --> 2
++countIter;
num1s += flagValue;
magical.push_back(flagValue);
}
flagValue = !flagValue;
}
return num1s;
}
这个还可以优化一下,比如使用deque只保存generateIter和countIter之间的数据。另外生成了一下前1000个数字,暂时没有看到有什么特别的规律。