题解 | #字符串出现次数的TopK问题#

字符串出现次数的TopK问题

http://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee



public class Solution {
    /**
     * return topK string
     * @param strings string字符串一维数组 strings
     * @param k int整型 the k
     * @return string字符串二维数组
     */
    // 定义一个类来存放 字符串和它出现的次数
    class Node{
        String str;
        int count;
        public Node(String str, int count){
            this.str  = str;
            this.count = count;
        }
    }
    public String[][] topKstrings (String[] strings, int k) {
        // write code here
        // 使用map 统计 每个字符串出现的次数
        HashMap<String,Integer> map = new HashMap<>();
        for(int i = 0; i < strings.length; i++){
            if(map.containsKey(strings[i])){
                map.put(strings[i],map.get(strings[i]) + 1);
            }else{
                map.put(strings[i],1);
            }
        }
        // 定义一个List 用来存放 string 和次数, 然后对List 排序
        ArrayList<Node> list = new ArrayList<>();
        for(Map.Entry<String,Integer> entry : map.entrySet()){
            list.add(new Node(entry.getKey(),entry.getValue() ));
        }
        // 使用 Collection.sort 进行排序, 自定义排序
        Collections.sort(list,new Comparator<Node>(){
            // 重写compare
            public int compare(Node a,Node b){
                if(a.count != b.count){
                    return b.count - a.count;
                }else{
                    return a.str.compareTo(b.str); // 按字典顺序排序
                }
            }
        });
        // 选出list中前面k个转化为二维数组返回
        // 定义二维数组
        String[][] returnArray = new String[k][2];
        for(int i = 0; i < k; i++){
            returnArray[i][0] = list.get(i).str;
            returnArray[i][1] = String.valueOf(list.get(i).count);
        }
        return returnArray;
    }
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务