假设有一个字符串。该字符串称为魔术字符串S,它仅由“ 1”和“ 2”组成,并遵循以下规则-
字符串S之所以具有魔力,是因为将字符“ 1”和“ 2”的连续出现次数串联起来可以生成字符串S本身。
字符串S的前几个组成部分如下-S =“ 1221121221221121122……”
如果我们在S中将连续的'1'和'2'分组,则将是− 1 22 11 2 1 22 1 22 11 2 11 22 ......并且每组中出现'1'或'2'的情况是-1 2 2 1 1 2 1 2 2 1 2 2 ......
现在假设我们有一个整数N作为输入,在魔幻字符串S中的前N个数字中找到'1'的数目。因此,如果输入像6,那么输出将是3,作为魔幻字符串中的前6个元素是“ 12211”。它包含三个1,因此返回3。
为了解决这个问题,我们将遵循以下步骤-
如果n <= 0,则返回0,如果n <= 3,则返回1
ret:= 1,设置大小为n的数组arr
arr [0]:= 1,arr [1]:= 2,arr [2]:= 2
头:= 2,尾巴:= 3和num:= 1
而尾巴<n
arr [tail]:= num
如果num为1并且tail <n,则将ret增加1
将尾巴增加1
如果tail> = n,则中断循环
对于我,范围从0到arr [head] – 1
num = num XOR 3
头增加1
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int magicalString(int n) { if(n <= 0) return 0; if(n <= 3) return 1; int ret = 1; vector <int> arr(n); arr[0] = 1; arr[1] = 2; arr[2] = 2; int head = 2; int tail = 3; int num = 1; while(tail < n){ for(int i = 0; i < arr[head]; i++){ arr[tail] = num; if(num == 1 && tail < n) ret++; tail++; if(tail >= n) break; } num ^= 3; head++; } return ret; } }; main(){ Solution ob; cout << (ob.magicalString(6)); }
6
输出结果
3