Kolakoski序列及应用扩展

来源:互联网 发布:php商城订单 编辑:程序博客网 时间:2024/05/19 23:56

/*

2018搜狐秋招笔试题(技术类)

题目要求: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……];
对于其他给定的整数组,同样可以用类似的方法构造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[]
*/
/*
解题思路: 首先给定a数组,b数组中第一个数字肯定和a数组第一个数字相同,此时需要追踪b数组下标所对应的数字
           记住这个长度以便后边循环,例如,b[1]为2,那么b[2]肯定也为2,此时需要循环输出,然后更新a数组的序列,依次循环
  这里需要注意的是当a数组到达最后一个数字时,需要从头开始继续循环。

*/

#include<iostream>using namespace std;#if 1int main(){int n,m;  //n为要输出多少项序列,m为给定的整数组的长度cin>>n>>m;int *a = new int[m];  //输入给定的整数组int *b = new int[n];  //将要输出的Kolakoski序列for(int i = 0;i<m;i++){cin>>a[i];}int index = 0;int slow = 0;         for(int i = 0; i < n;)  {            b[i] = a[index];              int num = b[slow++];  //需要记住b数组的序列大小,重复输出数字for(int j = num;j>0;j--){                b[i++] = a[index];  //b数组存放重复的数字,num决定有几个相同的数字            }            index++; //相同的循环完之后,a数组中的数字需要往后走继续循环            if(index == m)  //a数组始终循环                index = 0;        }        for(int i = 0;i<n;i++)          cout<<b[i]<<endl;}#endif


 
原创粉丝点击