题解 | #字符串出现次数的TopK问题#
字符串出现次数的TopK问题
http://www.nowcoder.com/practice/fd711bdfa0e840b381d7e1b82183b3ee
public String[][] topKStrings (String[] strings, int k){ Map<String, Integer> map = new HashMap<>(); for (String str : strings) { map.put(str, map.getOrDefault(str, 0) + 1); // 将字符串以及出现的次数利用map记录下来, } Set<Map.Entry<String, Integer>> entrySet = map.entrySet(); List<Map.Entry<String, Integer>> list = new ArrayList<>(entrySet); // 对map中的entry 进行排序。 Collections.sort(list, new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { if (o1.getValue().intValue() == o2.getValue().intValue()){ // 如果出现次数相同, 则根据字符的ascii码排序 return o1.getKey().compareTo(o2.getKey()); }else { // 如果出现次数不同, 则根据出现次数排序。 return o2.getValue().compareTo(o1.getValue()); } } }); String[][] ans = new String[k][2]; // 取出前k个字符串 for (int i = 0; i < k; i++) { ans[i][0] = list.get(i).getKey(); ans[i][1] = list.get(i).getValue().toString(); } return ans; }