字符串是一个唯一的值,可以用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); } } }