kolakoski序列的输出
昨晚考试上交的答案通过率只有40%,琢磨了下,原来还有一种特殊情况没考虑。。。。。
以下代码通过率应该没错了的。
输入n,m和数组a[],n代表输出的序列整数个数,m是数组的长度
我的解题思路是:
给定的数组实际上控制了输出字母的顺序和个数,自定义一个数组装载输出的序列b[],b[]元素大小控制输出的个数,首先赋值b[0]=a[0]。
特殊情况一:m==1,那么输出序列只会是a[0]个a[0]的序列,要比较与n之间的大小关系
特殊情况二:m!=1时,若a[0]=1,则输出序列的下一个元素的个数会是a[1]个,控制权要转移给b[1],之后就要时刻考虑与n的大小关系
以下是我的代码,若有错误望大家能留言告知,可以相互学习讨论。
import java.util.Scanner;
public class Sohua {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in = new Scanner(System.in);
int n = in.nextInt();
int m = in.nextInt();
int a[] = new int[m];
int b[] = new int[n];
int x=0,count=0;
for(int i=0;i<m;i++){
a[i] = in.nextInt();
}
b[0]=a[0];
if(m==1){
int min = b[0]>n?n:b[0];
for(int j=0;j<min;j++){
System.out.println(a[0]);
}
}else if(m!=1 && a[0]!=1){
while(true){
for(int j=0;j<b[x];j++){
b[count]=a[x%m];
System.out.println(b[count]);
count++;
if(count >= n)break;
}
x++;
if(count >= n)break;
}
}else if(m!=1 && a[0]==1){
System.out.println(b[count]);
count++;
if(count >= n)return ;
x++;b[1]=a[1];
while(true){
for(int j=0;j<b[x];j++){
b[count]=a[x%m];
System.out.println(b[count]);
count++;
if(count >= n)break;
}
x++;
if(count >= n)break;
}
}
}
}