PAT题解——1071. Speech Patterns (25)

这篇博客介绍了PAT的1071题解,通过getline读取字符串str,并使用迭代器it扫描。遇到非数字和字母的字符时,将词汇存储到映射的计数容器中。在遍历计数容器找到出现次数最多的词时,需要注意避免因迭代器越界导致的段错误问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[声明]:这道题其实大体上和《算法笔记》的思路相同,但是使用了迭代器it对str进行扫描,和《算法笔记》上使用i和str.length()略有区别;不过还是贴出来;
[题目链接]:https://www.patest.cn/contests/pat-a-practise/1071
[解题思路]:使用getline输入string str;并扫描,遇到非数字和字母的符号时将得到的词计入map 映射的count容器中(注意先要调用find看是否已经存在);遍历count寻找最大的词;
[注意点]:由于扫描str的函数中包含了while循环,而这个while循环中也有it++,所以如果it=str.end()而退出此while循环后,注释处直接it++会导致for循环不断继续,最终使得最后一个测试点发生段错误;

#include<cstdio>
#include<map>
#include<string> 
#include<iostream>
using namespace std;

map<string,int> count;
int main(){
    string str;
    getline(cin,str); //输入str 
    for(string::iterator it=str.begin();it!=str.end();){ //使用迭代器遍历str以找到符合要求的词 
        string temp; int flag=0;  //temp记录暂时得到的词,flag=0表示没有找到,temp=""; 
        while(it!=str.end()&&(*(it)>='0'&&*(it)<='9')||(*(it)>='a'&&*(it)<='z')||(*(it)>='A'&&*(it)<='Z')){
            if(*it>='A'&&*it<='Z') *it=*it-'A'+'a'; //如果是大写转化为小写 
            temp+=*(it); //链接出完整的词 
            it++; flag=1; //flag=1表示temp不为空; 
        }
        if(flag){   //如果上面不使用flag,此处也可以换成 if(temp!="") 注意中间没有空格,表示temp不为空 
            if(count.find(temp)!=count.end()) count[temp]++;
            else count[temp]=1;
        }
        if(it!=str.end()) it++; //如果直接在上面的for循环中使用it++则会导致最后一个测试点段错误 
    }
    int max=0; string k; //最大的次数max,对应的字符串k 
    for(map<string,int>::iterator it=count.begin();it!=count.end();it++){ //遍历count映射找到最大的count对应的字符 串 
        if(it->second>max){
            k=it->first; //map映射中的string 
            max=it->second;//map映射中的int 
        }
    }
    cout<<k<<" "<<max<<endl;//输出 

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值