牛客-NC97-字符串出现次数的TopK问题
NC97. 字符串出现次数的TopK问题(medium)
方法一:HashMap+Collections.sort()
思路:比较直接的做法是:将字符串数组遍历,并将元素放到HashMap中统计出现频率,接着最核心的来了–排序–需要调用Collections工具类来进行定制排序,即<mark>先比较值是否相同,相同按键升序进行比较,不相同按值降序比较</mark>,最后再取值即可,可以写出以下代码:
import java.util.*;
public class Solution {
/** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return string字符串二维数组 */
public String[][] topKstrings (String[] strings, int k) {
// write code here
// 特判
if (k == 0) {
return new String[][]{
};
}
String[][] res = new String[k][2];
HashMap<String, Integer> mappings = new HashMap<>();
for (String str: strings) {
if (mappings.containsKey(str)) {
mappings.put(str, mappings.get(str) + 1);
} else {
mappings.put(str, 1);
}
}
// 先比较值是否相同,相同按键升序进行比较,不相同按值降序比较
List<Map.Entry<String, Integer>> infoIds = new ArrayList<Map.Entry<String, Integer>>(mappings.entrySet());
Collections.sort(infoIds, new Comparator<Map.Entry<String, Integer>>() {
public int compare(Map.Entry<String, Integer> o1,
Map.Entry<String, Integer> o2) {
if (o1.getValue() == o2.getValue()) return o1.getKey().compareTo(o2.getKey());
else return -Integer.compare(o1.getValue(), o2.getValue());
}
});
for (int i = 0; i < k; i++) {
res[i][0] = infoIds.get(i).getKey();
res[i][1] = infoIds.get(i).getValue() + "";
}
return res;
}
}
时间复杂度: O(NlogN),N表示字符串数组的长度。
空间复杂度: O(N),需要将字符串数组元素全部放入mappings中。