题解 | #字符串出现次数的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;
}
}