LeetCode題解:Magical String
阿新 • • 發佈:2019-02-14
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個數字,暫時沒有看到有什麼特別的規律。