1 solutions
-
0
题解:哈希表计数+自定义排序
我们可以使用一个哈希表来记录每一个字符串的出现次数,并且对字符串做一个去重。
然后我们将去重后的字符串存入一个新的字符串数组中,并按照题目的排序规则对这个字符串数组进行排序即可。
C++(17)
#include<bits/stdc++.h> using namespace std; const int N=1010; int n; string s[N]; unordered_map<string,int>cnts; //统计每个字符串出现的次数 int main(){ cin>>n; for(int i=1;i<=n;i++)cin>>s[i]; for(int i=1;i<=n;i++){ cnts[s[i]]++; } vector<string>p; //排序前的字符串 for(auto &[u,v]:cnts){ p.push_back(u); } sort(p.begin(),p.end(),[&](auto &a,auto &b) { if(cnts[a]!=cnts[b])return cnts[a]>cnts[b]; //按照出现的次数降序排序 return a<b; //相同出现次数按照字典序升序排序 }); for(auto &str:p)cout<<str<<" "; return 0; }
Java
import java.util.*; import java.util.stream.Collectors; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n = scanner.nextInt(); Map<String, Integer> cnts = new HashMap<>(); // 用于存储字符串及其出现次数 for(int i = 0; i < n; i++){ String s = scanner.next(); cnts.put(s, cnts.getOrDefault(s, 0) + 1); // 计算每个字符串出现的次数 } // 将字符串按照出现次数降序排序,出现次数相同的按照字典序升序排序 List<String> p = cnts.keySet().stream() .sorted((a, b) -> cnts.get(a) != cnts.get(b) ? cnts.get(b) - cnts.get(a) : a.compareTo(b)) .collect(Collectors.toList()); for(String str : p) { System.out.print(str + " "); } } }
Python
n = int(input()) cnts = {} # 用于存储字符串及其出现次数 s=input().split() for x in s: cnts[x] = cnts.get(x, 0) + 1 # 计算每个字符串出现的次数 # 将字符串按照出现次数降序排序,出现次数相同的按照字典序升序排序 p = sorted(cnts.keys(), key=lambda x: (-cnts[x], x)) for str in p: print(str, end=" ")
Information
- ID
- 185
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 4
- Tags
- # Submissions
- 258
- Accepted
- 5
- Uploaded By