Kolakoski序列及应用扩展

/*

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

using namespace std;

#if 1
int 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>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


 
  

 
  

 
 

你可能感兴趣的:(算法,公司笔试题)