GESP2025年3月真题解析(后续2)

hi,我是小汉堡,今天我们来讲词频统计这道题,直接开始


题目链接

洛谷题库
hydro题库


题目详情

题目描述

在文本处理中,统计单词出现的频率是一个常见的任务。现在,给定 n n n 个单词,你需要找出其中出现次数最多的单词。在本题中,忽略单词中字母的大小写(即 AppleappleAPPLEaPPle 等均视为同一个单词)。

请你编写一个程序,输入 n n n 个单词,输出其中出现次数最多的单词。

输入格式

第一行,一个整数 n n n,表示单词的个数;

接下来 n n n 行,每行包含一个单词,单词由大小写英文字母组成。

输入保证,出现次数最多的单词只会有一个。

输出格式

输出一行,包含出现次数最多的单词(输出单词为小写形式)。

输入输出样例 #1

输入 #1
6
Apple
banana
apple
Orange
banana
apple
输出 #1
apple

说明/提示

对于所有测试点, 1 ≤ n ≤ 100 1\leq n\leq 100 1n100,每个单词的长度不超过 30 30 30,且仅由大小写字母组成。


题目分析

这道题是**普及-**的题,比较简单,不过得用哈希表,没学过的赶快学一下(我会后续更新)。为啥一看就是哈希表的题呢?因为算法标签上有,因为一看是搞统计的,必用哈希。但是用哈希统计出现次数是很简单的,但是题上有个要求:

忽略单词中字母的大小写(即 Apple、apple、APPLE、aPPle 等均视为同一个单词)

这就难了,因为用find函数不能找到大小写不一的字符串:假如存进哈希表了一个a,后面又遇到了A,用find就找不到A,就又存了一个A,但是题上要就他们是个词,如何解决?记得大小写转换吗?我们把每个单词都变成小写不就完了!


方法一

code

#include<bits/stdc++.h>
using namespace std;

int main(){
    unordered_map<string,int> hashbbb;
    int n,maxn=-999;
    cin>>n;
    for(int i=1;i<=n;i++){
        string s;
        cin>>s;
        for(int i=0;i<s.length();i++){
            if(s[i]>='A'&&s[i]<='Z')
                s[i]+=32;
        }
        auto it=hashbbb.find(s);
        if(it!=hashbbb.end()){
            it->second++;
        }else{
            hashbbb[s]=1;
        }
    }
    auto maxit=hashbbb.begin();
    for(auto it=hashbbb.begin();it!=hashbbb.end();it++){
        if(maxn<it->second){
            maxit=it;
            maxn=it->second;
        }
    }
    cout<<maxit->first;
    return 0;
}

代码详解

第5行:定义了一个哈希表。索引是单词,所以是string类型,内容表示这个单词出现了几次,所以是int类型,哈希表叫hashbbb(我爱用这个名字)。

第8行:循环n,把每个单词输入进来,然后做存储或这统计工作。

第9~10行:定义单词,并输入。

第11~14行:将单词的每个字母都转为小写,相信你们都会,但我还是讲一下:先循环每个字母,判断这个字母是不是 ≥ A \ge A A而且 ≤ Z \le Z Z,意思是是否是大写字母,因为每个字母都有编码,大写字母的编码 ≥ A \ge A A而且 ≤ Z \le Z Z这里有相似详细的讲解。

第15~20行:先定义一个auto变量it(啥是auto我就默认你们知道,如果不知道等我更新哈希表讲解),然后找一下s这个单词,赋值给it。接着,如果it不等于哈希表的最后,那说明找到了,之前出现过这个词,it就在找到的那个位置,让这个位置的第二层,也就是内容自增1,因为这个词又多了一个:也就是当前的s。如果等于哈希表的最后,那就说明没找到这个单词,也就是之前没有这个单词,那就新存一下这个单词: h a s h b b b [ s ] = 1 hashbbb[s]=1 hashbbb[s]=1,方括号里填索引,等号后面填内容,我们是在找单词有没有的:有的话统计就是这个单词个数++、每的话存储,所以单词就是索引。因为已经有一个这个单词了:就是当前这个单词,所以存为1。

第22~28行:定义了maxit,和maxn(maxn在上边)。maxit表示出现次数最多的单词的迭代器,maxn表示出现次数最多的单词的出现次数。23行循环整个哈希表。循环里判断当前循环到的单词的位置的次数是否比当前最多次数大,如果大:更新maxn和maxit。如果不大:啥都不干。

第29行:输出最大的次数对应的单词,就是索引。正好存进哈希的是单词的全小写,题上也这样要求。


于是通过了
在这里插入图片描述


总结

这道题偏中等,我没想到三级考哈希,建议大家亲手写一写代码。这道建议学完哈希需要练习的同学练。好了,我是小汉堡,请您点个赞和关注,谢谢!顺便点一下投票吧!

目前提供的引用内容并未涉及20253月GESP 5级考试的具体真题解析。然而,可以推测该级别的考试可能涵盖了更高级别的编程概念和技术细节,例如但不限于算法设计、复杂的数据结构应用以及面向对象编程的核心原理。 以下是基于现有知识体系对于此类考试可能覆盖的内容范围及其解答方式的一个假设性分析: ### 可能的考点一:动态规划 #### 题目示例: 给定一个数组 `arr` 和目标值 `target`,求是否存在子集使得其和等于 `target`。 ```cpp bool canPartition(vector<int>& nums, int target) { vector<bool> dp(target + 1, false); dp[0] = true; for(auto num : nums){ for(int j=target; j>=num; --j){ dp[j] |= dp[j-num]; } } return dp[target]; } ``` 此代码片段展示了如何利用布尔类型的动态规划表来解决特定条件下的集合划分问题[^自定义]. ### 可能的考点二:图论基础 #### 题目示例: 实现广度优先搜索(BFS),用于在一个无向图中到最短路径长度。 ```cpp int shortestPathLength(vector<vector<int>>& graph, int start, int end){ queue<pair<int,int>> q; vector<bool> visited(graph.size(),false); q.push({start,0}); while(!q.empty()){ auto [node,dist]=q.front();q.pop(); if(node==end)return dist; if(visited[node])continue; visited[node]=true; for(auto neighbor:graph[node]){ if(!visited[neighbor]) q.push({neighbor,dist+1}); } } return -1;//如果无法到达终点返回-1表示不可达 } ``` 上述函数通过队列实现了标准的BFS逻辑,在探索过程中记录节点访问状态并更新距离信息[^自定义]. ### § 1. 动态规划中的状态转移方程是如何构建的? 2. 广度优先搜索相较于深度优先搜索有哪些优势和劣势? 3. 如何优化大规模稀疏矩阵上的图遍历操作效率? 4. 在实际开发场景下,我们通常会选择哪些库或者框架辅助完成复杂的算法模型搭建工作? 5. 如果遇到内存限制条件下处理超大尺寸数据的情况,应该采取何种策略调整程序运行模式以适应资源约束环境?
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值