题目描述:Kolakoski序列是自生成的无限序列,例如,当给定数组是[1,2]的时候,Kolakoski序列是这样的:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1...],
如果我们将相邻的相同数字分成一组,那么将会得到:
[[1],[2,2],[1,1],[2],[1],[2,2],[1],[2,2],[1,1],[2],[1,1],[2,2],[1],[2],[1,1],[2],[1],[2,2],[1,1]]
接下来对每个分组求它的长度,可以得出:
[1,2,2,1,1,2,1,2,2,1,2,2,1,1,2,1,1,2,2,1,2,1,1,2,1,2,2,1,1...]
可以看出,经过如上的变换后,数列保持不变。
思路分析:
代码分析:
#include<iostream>
using namespace std;
void Get(int *arr,int *brr,int lenarr,int lenbrr)
{
if(arr==NULL || brr==NULL || lenarr<0 || lenbrr<0)
return;
int index = 0; //往新数组插入的下标
int j = 0;
for(int i=0;index<lenarr;++i)
{
if(i==lenbrr)//循环插入
{
i = 0;
}
int tmp = (arr[j] == 0) ? brr[i]:arr[j]; //插入元素的个数需要按照情况而定
++j;//遍历新数组的下标
for(int k=0;k<tmp;++k)
{
arr[index++] = brr[i];//向新数组中插入元素
}
}
}
int main()
{
int m = 0;//一共有m个
cin>>m;
int *arr = new int[m];
for(int i=0;i<m;++i)
{
arr[i] = 0;
}
int n = 0;//元素有n个
cin>>n;
int *brr = new int[n];
for(int i=0;i<n;++i)
{
cin>>brr[i];
}
Get(arr,brr,m,n);
for(int i=0;i<m;++i)
{
cout<<arr[i]<<" ";
}
}