一、问题描述
二、算法描述
据分析可知该题目难点在于如何构造该“神奇字符串”,其构造仅由'1','2'构成,其中由题可知前三位为1,2,2,故从第四位开始构造,易知,若存放次数为1,存放的数必为2(即1,2交替出现否则不符合“神奇字符串”要求)。故使用双指针,且使用size变量记录每次小循环的执行次数(即要存放几个数),num变量记录每次存放的数字, 若i所指向的元素为1则接下来只需存放一个元素,且3-s[i]是我们要存放的num,具体代码如下。
三、具体代码
int magicalString(int n){
if(n<4)
return 1;
int i=2,j=3,ans=1;
char s[n+1];
s[0]='1';
s[1]='2';
s[2]='2';
while(j<n){
int size = (s[i]-'0');
int num = 3-(s[j-1]-'0');
while(size>0&&j<n){
s[j]='0'+num;
if(num == 1 ){
ans++;
}
size--;
j++;
}
i++;
}
return ans;
}
四、运行结果