搜狐笔试编程题-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]的例子是可以的

原文地址:https://www.cnblogs.com/rgly/p/7446206.html