输入:两行数据
第一行包括n和m,空格隔开,n表示输出Kolakoski序列的前n项,m表示给定数组的长度
第二行m个数字,表示给定的数组元素
输出:n行
输出Kolakoski序列的前n项
这个题的首要的一点是要理解题目的意思,什么是Kolakoski序列以及怎么求?
第一,Kolakoski序列是基于一个初始序列的
第二,Kolakoski序列中的元素按照相邻的元素分为一组,每组求其长度得到是它本身
那么,我们怎么根据给定的初始数组得到对应的Kolakoski序列呢?
我们举个例子说明一下:
假设给定的初始数组是[2,3],因为初始数组的第一个元素为2,所以Kolakoski序列前2个元素为[2,2],
接下来,我们定义2个指针,一个指针a指向初始数组的第二个元素3,另一个指针b指向Kolakoski序列的第二个元素2,
我们看指针b指向2,a指向3,所以我们往Kolakoski序列中加入2个3,Kolakoski序列变为[2,2,3,3]
之后b指针继续指向下一个元素3,a指针指向2(a指针循环指向初始数组的每个值),所以我们往Kolakoski序列中加入3个2,Kolakoski序列变为[2,2,3,3,2,2,2]
……
重复上述步骤,直到Kolakoski序列中的元素大于n即可。
这里有一点比较特殊:当初始数组的第一个元素为1时,Kolakoski序列为[1],接下来我们还要根据初始数组的第二个值往Kolakoski序列添加元素。
下面我们看代码:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n = in.nextInt();
int m = in.nextInt();
int[] a = new int[m];
in.nextLine();
for(int i=0;i<m;i++)
a[i] = in.nextInt();
List<Integer> list = new ArrayList<>();
int index1 = 0;
int index2 = 0;
while(list.size() < n){
if(index2 == list.size()){
for(int i=0;i<a[index1];i++)
list.add(a[index1]);
}else{
for(int i=0;i<list.get(index2);i++)
list.add(a[index1]);
}
index2++;
index1 = (index1+1)%a.length;
}
for(int i=0;i<n;i++)
System.out.println(list.get(i));
}
}
}