去除捣乱的报数:
题目描述:
报学号,每报一次可以获得一个礼物,但是不给报数次数超过了一定的次数的学生发礼物。
规定,但发现某个数大于m次时,则认定为报数过多,需要得到去除这些学生的报数后的报数数列
输入描述:
第一行:两个数,学生报到总个数n,和允许的最大重复次数m,以空格分隔,其中1<=n<=1000
第二行:n个整数,表示学生所有报数数列,以空格分开,范围是-2147483648~2147483647
输出描述:
只有一行,去除超出m次的报数数字后的报数数列,该数列不改变原报数顺序,数列以空格分隔
示例1:
输入:
7 2
4 3 3 3 1 5 5
输出:
4 1 5 5
示例2:
输入:
6 3
1 2 2 2 2 2
输出:
1
分成两段处理
代码:
import java.util.ArrayList;
import java.util.Scanner;
public class yfd1 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
while (in.hasNextInt()) {
int n=in.nextInt();
int m=in.nextInt();
int[] arr=new int[n];
for(int i=0;i<n;i++) {
arr[i]=in.nextInt();
}
ArrayList<Integer> out=new ArrayList<Integer>();
for(int i=0;i<n-m;i++) {
if(arr[i+m]!=arr[i]) {
out.add(arr[i]);
}else {
int cc=1;
while(i+m+cc<(n-m)&&arr[i+m+cc]==arr[i]) {
cc++;
}
i=i+m+cc-1;
}
}
if(arr[n-m-1]!=arr[n-m]) {
for(int i=n-m;i<n;i++) {
out.add(arr[i]);
}
}
for(int nn:out)
System.out.print(nn+" ");
}
}
}
测试用例:
/*7 2
4 3 3 3 1 5 5
4 1 5 5
6 3
1 2 2 2 2 2
1*/
yfd1