给定一个字符串数组,再给定整数 k ,请返回出现次数前k名的字符串和对应的次数。
返回的答案应该按字符串出现频率由高到低排序。如果不同的字符串有相同出现频率,按字典序排序。
对于两个字符串,大小关系取决于两个字符串从左到右第一个不同字符的 ASCII 值的大小关系。
比如"ah1x"小于"ahb","231"<”32“
字符仅包含数字和字母
数据范围:字符串数满足 ,每个字符串长度 ,
要求:空间复杂度 ,时间复杂度
["a","b","c","b"],2
[["b","2"],["a","1"]]
"b"出现了2次,记["b","2"],"a"与"c"各出现1次,但是a字典序在c前面,记["a","1"],最后返回[["b","2"],["a","1"]]
["123","123","231","32"],2
[["123","2"],["231","1"]]
"123"出现了2次,记["123","2"],"231"与"32"各出现1次,但是"231"字典序在"32"前面,记["231","1"],最后返回[["123","2"],["231","1"]]
["abcd","abcd","abcd","pwb2","abcd","pwb2","p12"],3
[["abcd","4"],["pwb2","2"],["p12","1"]]
import java.util.*; public class Solution { /** * return topK string * @param strings string字符串一维数组 strings * @param k int整型 the k * @return string字符串二维数组 */ public static String[][] topKstrings (String[] strings, int k) { // write code here 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); } PriorityQueue<String> heap = new PriorityQueue<String>(k, new Comparator<String>() { @Override public int compare(String s1, String s2) { return map.get(s1) - map.get(s2); } }); for (String s : map.keySet()) { if (heap.size() >= k) { int top = map.get(heap.peek()); if (map.get(s) >= top) { heap.poll(); } } heap.offer(s); } String[][] res = new String[2][k]; while (!heap.isEmpty()) { String s = heap.peek(); int size = heap.size(); res[size - 1][0] = s; res[size - 1][1] = String.valueOf(map.get(s)); heap.poll(); } return res; } }
//第一次写了个超越100%的代码必须记录下 public String[][] topKstrings(String[] strings, int k) { String[][] res = new String[k][2]; HashMap<String, Integer> map = new HashMap<>(); for (int i = 0; i < strings.length; i++) { map.put(strings[i], map.getOrDefault(strings[i], 0) + 1); } PriorityQueue<Map.Entry<String, Integer>> pri = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> map1, Map.Entry<String, Integer> map2) { int ans = map2.getValue() - map1.getValue(); return ans == 0 ? map1.getKey().compareTo(map2.getKey()) : ans; } }); for (Map.Entry<String, Integer> entry : map.entrySet()) { pri.offer(entry); } for (int i = 0; i < k; i++) { Map.Entry<String, Integer> entry = pri.poll(); res[i][0] = entry.getKey(); res[i][1] = String.valueOf(entry.getValue()); } return res; }
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 String[][] ans=new String[k][2]; if(k==0) return ans; Map<String,Integer> maps=new HashMap<>(); for(String str:strings){ maps.put(str,maps.getOrDefault(str,0)+1); } List<Map.Entry<String,Integer>> list=new ArrayList<Map.Entry<String,Integer>>(maps.entrySet()); 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()==o2.getValue()){ return o1.getKey().compareTo(o2.getKey()); } return o2.getValue()-o1.getValue(); } }); for(int i=0;i<k;i++){ ans[i][0]=list.get(i).getKey(); ans[i][1]=String.valueOf(list.get(i).getValue()); } return ans; } }方法二:用最小堆。每次把小的元素弹出,最后剩下的k个就是最大的。
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 String [][]ans=new String[k][2]; if(k==0) return ans; Map<String,Integer> maps=new HashMap<>(); for(String str:strings){ maps.put(str,maps.getOrDefault(str,0)+1); } PriorityQueue<String> heap=new PriorityQueue<String>(new Comparator<String>(){ @Override public int compare(String s1,String s2){ if(maps.get(s1).equals(maps.get(s2))) return s2.compareTo(s1); return maps.get(s1)-maps.get(s2); } }); for(String str:maps.keySet()){ heap.offer(str); if(heap.size()>k) heap.poll(); } // while(!heap.isEmpty()){ // System.out.println(heap.poll()); // } for(int i=k-1;i>=0;i--){ ans[i][0]=heap.poll(); ans[i][1]=String.valueOf(maps.get(ans[i][0])); } return ans; } }注意:比较Integer的大小用equals()!!!!
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) { String s[][] = new String[0][0]; return s; } String[][] res = new String[k][2]; HashMap<String, Integer> tmap = new HashMap<>(); for (int i = 0; i < strings.length; i++) { String s = strings[i]; if (!tmap.containsKey(s)) { tmap.put(s, 1); } else { tmap.put(s, tmap.get(s) + 1); } } //将map中的key,value存放到list集合中 ArrayList<Map.Entry<String, Integer>> list = new ArrayList<>(tmap.entrySet()); Collections.sort(list, (o1, o2) -> (o1.getValue().compareTo(o2.getValue()) == 0 ? o1.getKey().compareTo(o2.getKey()) : o2.getValue().compareTo(o1.getValue())) ); for (int i = 0; i < k; i++) { res[i][0] = list.get(i).getKey(); res[i][1] = String.valueOf(list.get(i).getValue()); } return res; } }
public String[][] topKstrings (String[] strings, int k) { Map<String, Integer> map = new HashMap<>(); for (int i = 0; i < strings.length; i++) { if (!map.keySet().contains(strings[i])) { map.put(strings[i], 1); } else { int v = map.get(strings[i]); map.put(strings[i], v + 1); } } String[][] strDim = new String[map.size()][2]; int index = 0; for (String key : map.keySet()) { strDim[index++] = new String[]{key, String.valueOf(map.get(key))}; } Arrays.sort(strDim, new Comparator<String[]>() { public int compare(String[] s1, String[] s2) { if (!s1[1].equals(s2[1])) { return Integer.parseInt(s2[1]) - Integer.parseInt(s1[1]); } else { return s1[0].compareTo(s2[0]); } } }); return Arrays.copyOfRange(strDim, 0, k); }
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(strings.length==0) return new String[0][0]; HashMap<String,Integer>map=new HashMap<>(); for(String s:strings){ map.put(s,map.getOrDefault(s,0)+1); } PriorityQueue<String[]>queue=new PriorityQueue<>((a,b)->{ int v1=Integer.parseInt(a[1]); int v2=Integer.parseInt(b[1]); if(v1!=v2) return v1-v2; else return b[0].compareTo(a[0]); }); for(Map.Entry<String,Integer>entry:map.entrySet()){ String key=entry.getKey(); String value=entry.getValue()+""; String[]arr=new String[]{key,value}; queue.offer(arr); if(queue.size()>k){ queue.poll(); } } String[][]res=new String[k][2]; int index=k-1; while(!queue.isEmpty()){ res[index--]=queue.poll(); } return res; } }
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]; Map<String,Integer> map=new HashMap<>(); // TreeMap<String,Integer> map = new TreeMap<>(); 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); } } ArrayList<Map.Entry<String, Integer>> list =new ArrayList<>(map.entrySet()); Collections.sort(list,(o1, o2) ->(o1.getValue().compareTo(o2.getValue()) ==0 ? o1.getKey().compareTo(o2.getKey()) :o2.getValue().compareTo(o1.getValue()))); for (int i = 0; i < k; i++) { res[i][0] = list.get(i).getKey(); res[i][1] = String.valueOf(list.get(i).getValue()); } return res; } }
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 Map<String, Integer> map = new HashMap<String, Integer>(); // 统计单词出现的频率 for(String word : strings){ map.put(word,map.getOrDefault(word,0)+1); } // 利用list对map进行按值排序 List<Map.Entry<String, Integer>> listMap = new ArrayList<>(); listMap.addAll(map.entrySet()); Collections.sort(listMap,new Comparator<Map.Entry<String,Integer>>(){ @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2){ if(o1.getValue() != o2.getValue()){ // 按照出现次数排序 return o2.getValue()-o1.getValue(); }else{ // 出现次数相同,按照单词的字典序排序 return o1.getKey().compareTo(o2.getKey()); } } }); // 从map中取出前k个 String[][] ans = new String[k][2]; int count = 0; for(Map.Entry<String, Integer> lm : listMap){ if(count == k) break; String[] temp = new String[2]; temp[0] = lm.getKey(); temp[1] = lm.getValue()+""; ans[count] = temp; count++; } return ans; } }
// 优先队列节约时间 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 String[][] ans = new String[k][11]; PriorityQueue<Map.Entry<String,Integer>> q = new PriorityQueue<>(new Comparator<Map.Entry<String, Integer>>() { @Override public int compare(Map.Entry<String, Integer> o1, Map.Entry<String, Integer> o2) { if(!o1.getValue().equals(o2.getValue())){ return o2.getValue()-o1.getValue(); } return o1.getKey().compareTo(o2.getKey()); } }); Map<String,Integer> mp = new HashMap<>(); for (String string : strings) { mp.put(string,mp.getOrDefault(string,0)+1); } for(Map.Entry<String,Integer> entry:mp.entrySet()) { q.add(new AbstractMap.SimpleEntry<>(entry.getKey(), entry.getValue())); } int i = 0; while(k!=0){ Map.Entry<String, Integer> poll = q.poll(); String[] t = new String[2]; t[0] = poll.getKey(); t[1] = poll.getValue().toString(); ans[i] = t; i++; k--; } return ans; } }
import java.util.*; public class Solution { public String[][] topKstrings (String[] strings, int k) { // write code here String[][] ans=new String[k][2]; 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); } } PriorityQueue<String[]> pq=new PriorityQueue<>(k+1,(o1,o2)-> {if(Integer.parseInt(o1[1])==Integer.parseInt(o2[1])) return o2[0].compareTo(o1[0]); return Integer.parseInt(o1[1])-Integer.parseInt(o2[1]);}); for(String e:map.keySet()){ String[] s=new String[]{e,Integer.toString(map.get(e))}; pq.offer(s); if(pq.size()>k){ pq.poll(); } } int j=k-1; while(!pq.isEmpty()){ ans[j]=pq.poll(); j--; } // for(int i=k-1;i>=0;i--){ // ans[i]=pq.poll(); // } return ans; } }
import java.util.*; public class Solution { public String[][] topKstrings (String[] strings, int k) { //统计结果 Map<String, Integer> map = new HashMap<>(); for(int i=0; i<strings.length; i++){ map.put(strings[i], map.getOrDefault(strings[i], 0)+1); } //存入List<Node>方便排序 List<Node> list = new ArrayList<>(); Set<String> set = map.keySet(); for(String key : set){ list.add(new Node(key, map.get(key))); } //排序 Collections.sort(list, new Comparator<Node>(){ public int compare(Node a, Node b){ if(a.val!=b.val) return b.val-a.val; else return a.s.compareTo(b.s); } }); //选最大k个输出 String[][] res = new String[k][2]; for(int i=0; i<k; i++){ res[i][0] = list.get(i).s; res[i][1] = String.valueOf(list.get(i).val); } return res; } } class Node{ String s; int val; public Node(String s, int val){ this.s = s; this.val = val; } }