首页 > 试题广场 >

去除捣乱的报数

[编程题]去除捣乱的报数
  • 热度指数:640 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
猿辅导老师在直播课上和同学们做游戏,让同学们在聊天区报自己的学号,每报一次可以获得一个礼物。但是老师不给报数次数超过了一定的次数的同学发礼物。
现在请你来帮助老师把聊天区的报数数列处理一下。
规定,当发现某个数大于 m 次时,则认定为报数过多,我们需要得到去除这些学生的报数后的报数数列。

输入描述:
第一行:两个数,学生报数总个数n,和允许的最大重复次数 m,以空格分隔
第二行: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

备注:
1 <= n <= 1000
//维护一个计数的HashMap即可
import java.util.*;
 
public class Main{
    public static void main(String[] args){
        Scanner input;
        int n, m, i;
        int[] nums;
         
        input = new Scanner(System.in);
        n = input.nextInt();
        m = input.nextInt();
        nums = new int[n];
        for(i = 0; i < n; i++){
            nums[i] = input.nextInt();
        }
        System.out.println(Solution(nums, m));
        input.close();
    }
    
    private static String Solution(int[] nums, int m){
        StringBuilder ans;
        Map<Integer, Integer> map;
        
        ans = new StringBuilder();
        map = new HashMap<>();
        for(int num : nums){
            map.put(num, map.getOrDefault(num, 0) + 1);
        }
        for(int i = 0; i < nums.length; i++){
            if(map.get(nums[i]) > m)
                continue;
            ans.append(nums[i]);
            ans.append(" ");
        }
        return ans.toString();
    }
}

发表于 2019-12-23 16:43:34 回复(0)