说话方式

说话方式

1. 题目地址

    https://www.acwing.com/problem/content/1559/

2. 题目解析

    这道题主要就是给定一个字符串,求出字符串中出现次数最多的单词。

3. 题解

    首先,来讲述一下这道题的思路:
        1.  由于这道题中的字符串含有空格,因此我们不能用cin接收,而应该用getline函数来接收。
        2.  接收完之后,我们应该抠出字符串当中的单词(使用双指针算法,具体思想可以参考之前的博客),将单词存储在哈希表当中,并记录次数。
        3.  最后,遍历一遍哈希表,找出出现次数最多的单词即可。(还需要考虑题目中的字典序情况)

4. 代码

#include <iostream>
#include <cstdio>
#include <unordered_map>

using namespace std;

//将string进行哈希,并存储字符串的个数
unordered_map<string,int> h;

//判断字符是否为字母,数字。
bool check(int c){
    if(c >= '0' && c <= '9') return true;
    if(c >= 'A' && c <= 'Z') return true;
    if(c >= 'a' && c <= 'z') return true;
    return false;
}

//将大写字母转换成小写字母
char to_lower(int c){
    if(c >= 'A' && c <= 'Z'){
        return c + 32;
    }
    return c;
}

string str;

int main(){
    getline(cin,str);
    //抠出字符串中的单词,并存储在h表中
    for(int i = 0; i < str.size(); i ++){
        if(check(str[i])){
            string word = "";
            int j = i;
            while(j < str.size() && check(str[j])){
                word += to_lower(str[j++]);
            }
            h[word]++;
            i = j;
        }
    }
    int cnt = -1;
    string word;
    //遍历哈希表,得出答案
    for(auto item : h){
        string per_word = item.first;
        int number = item.second;
        //两个条件:1.  如果遍历的单词出现次数更大,更新。
        //         2.  或者次数相等,遍历的单词字典序更小,更新。
        if(cnt < number || cnt == number && word > per_word){
            cnt = number;
            word = per_word;
        }
    }
    
    cout << word << " " << cnt << endl;
    
    return 0;
}
posted @   夏目^_^  阅读(15)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示