算法题10

去除捣乱的报数:
题目描述
报学号,每报一次可以获得一个礼物,但是不给报数次数超过了一定的次数的学生发礼物。
规定,但发现某个数大于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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值