zoukankan      html  css  js  c++  java
  • 搜狐笔试编程题-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]的例子是可以的

  • 相关阅读:
    Autofac +webapi 配置
    net 记录controller Action耗时
    C# ASP.NET Core使用HttpClient的同步和异步请求
    C#实体对象序列化成Json,格式化,并让字段的首字母小写
    Razor 将C#对象转换成Javascript对象, json还原被转码的字符 &quot·· HTML转义符
    js 递归树结构数据查找父级
    api下载文件
    Ubuntu django+nginx 搭建python web服务器文件日志
    python scrapy cookies 处理
    ubuntu 环境下pycharm的 安装与激活教程 以及错误解决方法
  • 原文地址:https://www.cnblogs.com/rgly/p/7446206.html
Copyright © 2011-2022 走看看