PAT_甲级_1071 Speech Patterns (25point(s)) (C++)【字符串处理/单词统计】

目录

1,题目描述

题目描述

2,思路

3,AC代码

4,知识补充

大小写转换

5,解题过程

第一搏

第二搏

第三搏


1,题目描述

  • synonym:同义词;
  • narrow down:压缩,减小;
  • validating:证实; 确认; 确证; 使生效; 使有法律效力; 批准; 确认…有效; 认可;
  • avatar:化身;
  • alphanumerical:字母数字混合编制的;
  • lexicographically:字典序; 按字典顺序;
  • insensitive:不敏感; 

题目描述

找出一段话中出现次数最多的单词(字母数字混合,且不分大小写)。

 

2,思路

凭直觉来看,一定是用map了。

注意如何分割单词,并且大小写转换,基本上就没什么问题了。

 

3,AC代码

#include<bits/stdc++.h>
using namespace std;
bool isAlp(char c){
    if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
        return true;
    return false;
}
int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE

    map<string,int> data;
    char c;
    string s;
    scanf("%c", &c);
    while(c != '\n'){
        if(isAlp(c)) s += c;
        else{
            if(s.size() != 0){
                transform(s.begin(), s.end(), s.begin(), ::tolower);
                data[s] += 1;
                s.clear();
            }
        }
        scanf("%c", &c);
    }
    if(s.size() != 0){
        transform(s.begin(), s.end(), s.begin(), ::tolower);
        data[s] += 1;
        s.clear();
    }
    int max = 0;
    for(auto it : data){
        if(it.second > max){
            s = it.first;
            max = it.second;
        }
    }
    cout<<s<<' '<<max;
    return 0;
}

 

4,知识补充

大小写转换

大小写转换,可以看这里@荷叶田田_【【用法总结】C++中常用的大小写转换(4种常用方法)】

此处使用的是transform(first,last,result,op);//first是容器的首迭代器,last为容器的末迭代器,result为存放结果的容器,op为要进行操作的一元函数对象或sturct、class

eg.string s = "Acdd";
    transform(s.begin(), s.end(), s.begin(), ::tolower);//注意格式 tolower后没有括号

 

5,解题过程

第一搏

原以为代码天衣无缝,然而还是

#include<bits/stdc++.h>

using namespace std;

bool isAlp(char c){
    if((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z'))
        return true;
    return false;
}
int main(){
#ifdef ONLINE_JUDGE
#else
    freopen("1.txt", "r", stdin);
#endif // ONLINE_JUDGE

    map<string,int> data;
    char c;
    string s;
    scanf("%c", &c);
    while(c != '\n'){
        if(isAlp(c) == false && s.size() != 0){
            transform(s.begin(), s.end(), s.begin(), ::tolower);
            data[s] += 1;
            s.clear();
        }else s += c;
        scanf("%c", &c);
    }

    int max = 0;
    for(auto it : data){
        if(it.second > max){
            s = it.first;
            max = it.second;
        }
    }
    cout<<s<<' '<<max;

    return 0;
}

第二搏

补充了红色方框内的代码(有可能到结尾,s内仍存有一个单词),测试点4通过了

第三搏

仔细一想,逻辑好像有点乱,于是重新调整了一下,改成了红色方框内的代码

PERFECT!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值