首页 > 试题广场 >

出现次数的TopK问题

[编程题]出现次数的TopK问题
  • 热度指数:1388 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定String类型的数组strArr,再给定整数k,请严格按照排名顺序打印 出次数前k名的字符串。
[要求]
如果strArr长度为N,时间复杂度请达到


输入描述:
第一行两个整数N, k。N表示数组大小
接下来N行,每行一个字符串


输出描述:
输出K行,每行有一个字符串和一个整数。
你需要按照出现出现次数由小到大输出,若出现次数相同时字符串字典序较小的优先输出
示例1

输入

4 2
1
2
3
4

输出

1 1
2 1
示例2

输入

4 2
1
1
2
3

输出

1 2
2 1

备注:


保证输入的字符串仅含有大小写字母/数字
先计数,然后用优先队列获得topk
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.IOException;
import java.util.*;

class Pair {
    String key;
    int value;
    public Pair(String key, int value) {
        this.key = key;
        this.value = value;
    }
}

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] params = br.readLine().split(" ");
        int n = Integer.parseInt(params[0]);
        int k = Integer.parseInt(params[1]);
        HashMap<String, Integer> counter = new HashMap<>();
        for(int i = 0; i < n; i++){
            String key = br.readLine();
            counter.put(key, counter.getOrDefault(key, 0) + 1);
        }
        PriorityQueue<Pair> pq = new PriorityQueue<>(new Comparator<Pair>(){
            @Override
            public int compare(Pair pair1, Pair pair2) {
                if(pair1.value != pair2.value)
                    return pair2.value - pair1.value;
                else
                    return pair1.key.compareTo(pair2.key);
            }
        });
        for(String key: counter.keySet())
            pq.offer(new Pair(key, counter.get(key)));
        for(int i = 0; i < k; i++){
            Pair pair = pq.poll();
            System.out.println(pair.key + " " + pair.value);
        }
    }
}

发表于 2021-10-20 15:52:06 回复(0)