您的位置:首页 > 编程语言

搜狐2017笔试编程题--Kolakoski序列

2017-08-28 21:39 288 查看
题目描述:

----------------------------------------------------------------------------------------------------------------------------------------------------------

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,

----------------------------------------------------------------------------------------------------------------------------------------------------------

C++代码实现:

#include <iostream>
#include <vector>

using namespace std;

int main()
{
int n, m;
cin >> n >> m;
vector<int> iVec(m);
for (int i = 0; i < m; ++i)
{
cin >> iVec.at(i);
}

vector<int> resVec(n);
int count = 0;
resVec.at(0) = iVec.at(0);
int index1 = 0;
int index2 = 0;
while (count < 30)
{
int t = resVec.at(index1);
while (t > 0)
{
resVec.at(count) = iVec.at(index2);
count++;
t--;
}
index1++;
index2++;
if (index2 == m)
{
index2 = 0;
}
}

for (int i = 0; i < resVec.size(); ++i)
{
cout << resVec.at(i) << ", ";
}
cout << endl;

system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Kolakoski 搜狐笔试