Skip to content

CSP认证2013年12月第一题:出现次数最多的数

概述

这学期老师要求每个人必须考一个CCF CSP认证考试,并且将会将认证的20%的成绩作为期末成绩,这下必须好好准备了就从简单的开始准备吧,毕竟我是求稳的人,先稳定了简单题再提高是个不错的选择。

题目

问题描述

给定n个正整数,找出它们中出现次数最多的数。如果这样的数有多个,请输出其中最小的一个。

输入格式

输入的第一行只有一个正整数n(1 ≤ n ≤ 1000),表示数字的个数。   输入的第二行有n个整数s1, s2, …, sn (1 ≤ si ≤ 10000, 1 ≤ i ≤ n)。相邻的数用空格分隔。

输出格式

输出这n个次数中出现次数最多的数。如果这样的数有多个,输出其中最小的一个。

样例输入

bash
6
10 1 10 20 30 20

样例输出

10

解题思路

先找到最大出现次数,然后将保存的每个key中找到最小的跟最大出现次数对应的值就好了

思路一:直接用时间换空间,通过一个大数组来索引所有值的数量

代码如下:

java
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        //每个元素代表数出现的数量
        int[] numbers = new int[10001];
        Scanner sc = new Scanner(System.in);
        int numberCount = sc.nextInt();
        for (int i=0;i<numberCount;i++){
            numbers[sc.nextInt()]++;
        }
        int max=0,index=0;
        for (int j=0;j<10001;j++){
            if (numbers[j]>max){
                max=numbers[j];
                index=j;
            }
        }

        System.out.println(index);
    }
}

基本思路:找出最大值之后就记录下最大值的位置索引,然后打印索引就是数目最大的值,并且由于从小到大排列,最后的值就是按顺序出现的最小的index

思路二:使用hash记录每个数字出现的次数----迭代器

这里思路很清晰,就是找到最大值之后从hash表中找出对应的key并且给key排序找到最小key

java
public class Main {
    public static void main(String[] args) {
        HashMap<Integer,Integer> hashMap = new HashMap<>();
        Scanner scanner = new Scanner(System.in);
        int numberCount = scanner.nextInt();
        int countNew = 0;
        Integer tempNumber;
        int max=0;
        for (int i=0;i<numberCount;i++){
            tempNumber = scanner.nextInt();
            countNew = hashMap.get(tempNumber)==null ? 1:hashMap.get(tempNumber)+1;
            if (countNew>max){
                max=countNew;
            }
            hashMap.put(tempNumber,countNew);
        }
        ArrayList<Integer> al = (ArrayList<Integer>) getKeys(hashMap,max);
        Collections.sort(al);
        System.out.println(al.get(0));
    }

    public static Object getKeys(Map map,Object value){
        ArrayList<Object> res=new ArrayList<>();
        Set<Map.Entry<Object,Object>> mapSet = map.entrySet();
        Iterator<Map.Entry<Object,Object>> iterator = mapSet.iterator();
        while(iterator.hasNext()){
            Map.Entry<Object,Object> objectObjectEntry = iterator.next();
            if (objectObjectEntry.getValue().equals(value)){
                res.add(objectObjectEntry.getKey());
            }
        }
        return res;
    }
}

思路三:使用hash记录每个数字出现的次数----遍历keyset

这里和上面不同的是这里使用的是for循环来解决迭代的问题

java
import java.util.*;

public class Main {
    public static void main(String[] args) {
        HashMap<Integer,Integer> hashMap = new HashMap<>();
        Scanner scanner = new Scanner(System.in);
        int numberCount = scanner.nextInt();
        int countNew = 0;
        Integer tempNumber;
        int max=0;
        for (int i=0;i<numberCount;i++){
            tempNumber = scanner.nextInt();
            countNew = hashMap.get(tempNumber)==null ? 1:hashMap.get(tempNumber)+1;
            if (countNew>max){
                max=countNew;
            }
            hashMap.put(tempNumber,countNew);
        }
        ArrayList<Integer> al = (ArrayList<Integer>) getKeys(hashMap, max);
        Collections.sort(al);
        System.out.println(al.get(0));
    }

    public static Object getKeys(Map map, Object value){
        Set<Object> keySet=map.keySet();
        ArrayList<Object> result = new ArrayList<>();

        for (Object key:keySet){
            if (map.get(key).equals(value)){
                result.add(key);
            }
        }
        return result;
    }
}