pat1071

4 篇文章 0 订阅
3 篇文章 0 订阅

字符串的题是我的弱项,因为我觉得我好像对数字感兴趣,其实这只是借口。

本题我在11月2号的时候只拿到了17分,已经忘了是怎么写的,早上做了半小时过了,我觉得让你在一串字符串中统计单词的问题需要注意三点:

1开始的时候需要注意单词的开始可能不是在这串东西的第0个位置,可能一开始带有几个空格或者其他非法字符,不过这只是可能,具体也要看题。我的处理的方法是到第一个合法字符开始统计

2中间可能有多个空格和非法字符,很多人觉得如果当前字符是非法的,开始把前面一段的字符定为一个单词,那么这样有一个问题 ,我连续两个非法的字符 ,会把空字符串也当做一个单词,我处理的方法是,碰到非法单词时,我在看看当前已经遍历到的串是否为空,若为空,那么说明是连续的非法字符,否则是一个新的单词

3结尾的时候可能会有字符没有被统计,比如结尾的时候是一个合法的字符,而我们的程序是碰到一个非法字符统计一次,那么最后那个单词时没有被统计过的,我的处理方法 是,循环结束后,再看看刚才保存遍历字符串是否为空,非空则再统计一次。

附代码如下:

#include<stdio.h>
#include<iostream>
#include<map>
#include<string.h>
#include<string>
using namespace std;
char c[1048577];
map<string,int >cl;
map<string,int >::iterator it;
int check(int i)
{
    if(c[i]>='a'&&c[i]<='z')
        return 1;
    if(c[i]>='A'&&c[i]<='Z')
        return 1;
    if(c[i]>='0'&&c[i]<='9')
        return 1;
    return 0;
}
int main()
{
    gets(c);
    int i,j;
    for(i=0;c[i];i++)
    if(c[i]>='A'&&c[i]<='Z')
    c[i]+=32;
    for(i=0;c[i];i++)
    if(check(i))
        break;
    string cc="";
    int flag=0;
    for(j=i;c[j];j++)
    {
        if(check(j))
            cc+=c[j];
        else
        {
            if(cc!="")
            {
                cl[cc]++;
                cc="";
            }
        }
    }
    if(cc!="")
        cl[cc]++;
    int max=0;
    string ans;
    for(it=cl.begin();it!=cl.end();it++)
    {
        if(max<(*it).second)
        {
            max=(*it).second;
            ans=(*it).first;
        }
    }
    cout<<ans<<" "<<max<<endl;
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值