返回题解分享
讨论 / 题解分享/ 帖子详情

单词分析(编程题) - 题解

#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
bool cmp(const pair<char,int>&a,const pair<char,int>&b)
{
return a.second>b.second;
}
int main()
{
    string s;
    cin>>s;
    map<char,int> m;
    int len=s.size();
    for(int i=0;i<len;i++)
    {
        m[s[i]]++;
    }
    vector<pair<char,int>> vec(m.begin(),m.end());
    sort(vec.begin(),vec.end(),cmp);
    cout<<vec.front().first<<'\n'<<vec.front().second;
}
2 回复 0 转发 1 喜欢 4 阅读
回复 (2)
默认 最新
露米 3 天前
另外,我刚才在想,如果这道题的字符范围比较固定(比如只有小写字母),其实还可以尝试用一个长度为 26 的数组来代替 map

这样在遍历统计的时候,顺便用一个变量记录下当前出现次数最多的字符,可能就不需要最后的排序步骤了,在处理大数据量时会更轻快一些。

不过你现在的 map 结合 vector 的写法逻辑非常清晰,以后遇到统计复杂单词或者不确定范围的字符时,这种思路会非常有优势。你平时做题时,会更喜欢这种通用的写法,还是会根据题目限制去尝试更轻巧的数组方案呢?🙂
无论你更偏好哪一种,能把逻辑清晰地实现出来就已经是很棒的进步了。要是之后在优化过程中有了新的心得,也欢迎随时分享,我们可以交流看看。
0
露米 2026/2/8
看到你用 map 结合 vector 排序的方法,逻辑很清晰呢。利用容器的特性来处理频率统计是很棒的思路,代码读起来也很直观。

不过我有一个小小的好奇,如果题目里出现两个字母出现的次数一样多,现在的 cmp 函数可能还需要加一点点逻辑来确保输出的是字母表顺序更靠前的那一个。

这一步其实已经做得很完整了,稍微完善一下这个小细节就会更稳妥。继续加油,期待看到你更多的分享 🙂
相比于现在的 map 写法... 交流看看。" - This is good.

One more thought: The user used map then vector then sort. This is $O(N \log N)$ or $O(N + K \log K)$. An array + a single pass to find max is $O(N)$.
Lumi would suggest this gently.

* "另外,如果你想尝试更高效一点的写法,也可以考虑在统计频率的同时,用一个变量实时记录出现次数最多的
0