搜狐笔试编程题-Kolakoski序列
题目描述:
----------------------------------------------------------------------------------------------------------------------------------------------------------
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组成。
接下来对每个分组求他的长度,得到:
[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, ...]
可以看出,经过如上的变换后,数列保持不变。
对于其他给定的整数组,同样可以用类似的方法构造Kolakoski序列,例如给定整数组[2, 3]时:
[2, 2, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3, 2, 2, 3, 3, 3, 2, 2, 2, 3, 3, 3, 2, 2, 3, 3,...]
给定整数组[2, 1, 3, 1]时,构造得到如下:
[2, 2, 1, 1, 3, 1, 2, 2, 2, 1, 3, 3, 1, 1, 2, 2, 1, 3, 3, 3, 1, 1, 1, 2, 1, 3, 3, 1, 1,...]
----------------------------------------------------------------------------------------------------------------------------------------------------------
输入描述:
----------------------------------------------------------------------------------------------------------------------------------------------------------
输入由两行组成:
第一行包括两个正整数n, m
第二行包括m个正整数a[]
数据规模与限制:
0<n<10000
1<m<1000
0<a[i]<1000
a[i]不等于a[i+1]
a[0]不等于a[m-1]
输出描述:
每行一个数字,共n行
整数组a生成的Kolakoski序列的前n项
示例1:
----------------------------------------------------------------------------------------------------------------------------------------------------------
输入:
30 4
2 1 3 1
输出:(此处为了书写方便采用逗号分隔)
2, 2, 1, 1, 3, 1, 2, 2, 2, 1, 3, 3, 1, 1, 2, 2, 1, 3, 3, 3, 1, 1, 1, 2, 1, 3, 3, 1, 1, 2,
思路分析:
假设元素数组a是[2,1,3,1],创建一个新的容器res存储
(1)首先从原数组第一个元素开始,即a[0]=2,将2插入res中,n--(这里需要输出n行,所以每插入一个元素,n--),
因为这时res[0]==2,所以再插入一个元素到res中,此时,res中元素为2,2
(2)再看res[1]的值,为2,所以往res中插入两个1,此时res中元素为2,2,1,1
(3)看res[2]的值,为1,所以往res中插入一个3,此时res中元素为2,2,1,1,3
(4)看res[3]的值,为1,所以往res中插入一个1,此时res中元素为2,2,1,1,3,1
(5)看res[4]的值,为3,所以再往res中插入3个2,此时res中的元素为2,2,1,1,3,1,2,2,2
.....以此类推,根据res[i]的值轮流将(2,1,3,1)四个值插入到res中,res[i]的值即为插入元素的个数
代码如下:
#include<iostream> #include<vector> using namespace std; vector<int> Kolakoski(int *a,int m,int n){ vector<int> res; res.push_back(a[0]);//首先将a[0]插入 n--; if(a[0]==1){ //当第一个数值为1的时候,再插入a[1] res.push_back(a[1]); } else{ int nt=res[0]-1;//假设a[0]的值为2,则插入2个2 while(nt--){ res.push_back(a[0]); n--; //所需要输出的元素减一 } } int j=1;//令j保存原数组走到哪一个值 for(int i=1;;++i){ int num=res[i]; //从i=1开始,计算res[i]的值 while(num--){ res.push_back(a[j]); //插入res[i]个当前原数组的值 n--; } if(n==0){//当n=0时,跳出循环 break; } j++;//插入res[i]个当前原数组的值以后,原数组的值往后移动一位 j=j%m;//因为原数组需要循环 } return res; } int main(){ int n,m; cin>>n>>m; int a[1000]; for(int i=0;i<m;++i){ cin>>a[i]; } vector<int> res=Kolakoski(a,m,n); for(int i=0;i<n;++i){ cout<<res[i]<<endl; } system("pause"); return 0; }
总结:因为笔试时没来得及做出来,在笔试完成之后才做完,所以不知道是否可以AC通过,但测试的[1,2], [2,1,3,1]的例子是可以的