字符串是一个唯一的值,可以用map进行存储。同时,需要对出现的次数进行,排序,map不支持排序。可以使用SortedSet的实现进行求解。map+treeset可以解决。最后注意一下k的取值可能大雨map.size就行了。

public class NC97 {
    /**
     * return topK string
     *
     * @param strings string字符串一维数组 strings
     * @param k       int整型 the k
     * @return string字符串二维数组
     */
    public String[][] topKstrings(String[] strings, int k) {
        HashMap<String, Data> map = new HashMap<>();
        TreeSet<Data> list = new TreeSet<>();
        for (String str : strings) {
            if (map.containsKey(str)) {
                Data data = map.get(str);
                list.remove(data);
                data.val++;
                list.add(data);
            } else {
                Data data = new Data(1, str);
                map.put(str, data);
                list.add(data);
            }
        }
        if (k>list.size()){
            k = list.size();
        }
        String[][] result = new String[k][];
        for (int i = 0; i < k; i++) {
            Data data = list.pollLast();
            result[i] = new String[2];
            result[i][0] = data.str;
            result[i][1] = String.valueOf(data.val);
        }
        return result;
    }

}

class Data implements Comparable<Data> {
    Integer val;
    String str;

    public Data(Integer val, String str) {
        this.val = val;
        this.str = str;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Data data = (Data) o;
        return Objects.equals(str, data.str);
    }

    @Override
    public int hashCode() {
        return Objects.hash(str);
    }

    @Override
    public int compareTo(Data o) {
        int i = this.val.compareTo(o.val);
        if (i != 0) {
            return i;
        } else {
            return o.str.compareTo(this.str);
        }
    }
}