1 条题解

  • 0
    @ 2025-4-8 20:18:04

    题目分析

    这道题目要求我们统计一段英文文本中每个单词出现的次数,并输出恰好出现指定次数 ( n ) 的所有单词。单词由字母组成,不区分大小写,且单词之间由非字母字符分隔。我们需要处理多个测试用例,每个用例以 EndOfText 结束。

    方法思路

    1. 输入处理:逐行读取输入文本,直到遇到 EndOfText 为止。
    2. 单词提取和标准化:对于每一行,将所有非字母字符替换为空格,并将所有字母转换为小写,以便统一处理。
    3. 单词统计:使用 stringstream 以空格为分隔符分割单词,并用 map<string, int> 统计每个单词的出现次数。
    4. 结果输出:遍历统计后的 map,输出所有出现次数恰好为 ( n ) 的单词,按字典序排列。如果没有这样的单词,输出提示信息。

    解决代码

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    #include<sstream>
    #include<algorithm>
    using namespace std;
    map<string,int>a;
    int main()
    {
        int n,flag=0,i,flag1;
        string s;
        while(~scanf("%d",&n))
        {
            a.clear();
            if(flag==0)
            {
                flag=1;//在第2次以及以后的输入n之后都要先输出一个空行
            }
            else if(flag==1)
            {
                printf("\n");
            }
            while(getline(cin,s))//逐行读取
            {
                if(s=="EndOfText")
                    break;
                else
                {
                    for(i=0;i<s.size();i++)
                    {
                        if(isalpha(s[i]))
                            s[i]=tolower(s[i]);
                        else
                            s[i]=' ';/*这里一定要注意不是字母的就一定要变成空格
                            不然其他字符出现了n次也会输出*/
     
                    }
                }
                stringstream s1(s);
                string s2;
                while(s1>>s2)//以空格为边界
                {
                    a[s2]++;
                }
            }
            flag1=0;//标记有没有出现过n次的单词
            for(map<string,int>::iterator it=a.begin();it!=a.end();it++)
            {
                if(it->second==n)
                {
                    flag1=1;
                    cout<<it->first<<endl;
                }
            }
            if(flag1==0)
                printf("There is no such word.\n");//表示没有这样的单词
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1551
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者