关于算法-数据结构:PAT甲级1071-Speech-Patterns

11次阅读

共计 811 个字符,预计需要花费 3 分钟才能阅读完成。

题目粗心:

给出一个字符串, 要求统计呈现次数最多的单词, 并且输入该单词和次数(不辨别大小写, 输入小写), 单词为数字和英文字母的组合

算法思路:

间接一边输出一边解决就好,应用 c 保留输出的每一个字符,s 保留呈现的每一个单词,如果是大写字符就转化为小写字符,而后将 c 增加到 s 的开端,如果是小写字符或者数字将 c 增加到 s 的开端,如果是其余字符并且 s 不为空,就开始统计该单词呈现的次数,同时判断以后单词 s 的次数是否为最大,如果是就更新 max_count 和 r(保留输入后果), 最初如果是回车就退出循环,输入后果即可

留神点:

1、如果输出 a, 该当输入 a 1,对应测试点 4,这里的解决就是在最初判断是否是回车,让统计次数逻辑首先进行。

提交后果:

AC 代码:

#include <cstdio>
#include <unordered_map>
#include <string>


using namespace std;

unordered_map<string,int> counts;// 每一个 word 呈现的频次

int main(){
    char c;
    string s;// 暂存每一个单词
    int max_count = -1;// 呈现的最高频次
    string r;// max_count 对应的 word
    while (true){scanf("%c",&c);
        if(c>='A'&&c<='Z'){
            // 大写字符转化为小写字符
            c = c+32;
            s += c;
        } else if((c>='a'&&c<='z')||(c>='0'&&c<='9')){
            // 小写字母或者数字
            s += c;
        } else {
            // 不是英文字符
            if(!s.empty()){++counts[s];
                if(counts[s]>max_count){max_count = counts[s];
                    r = s;
                }
                s = "";// 清空 s
            }
        }
        if(c=='\n') break;
    }
    printf("%s %d",r.c_str(),max_count);
    return 0;
}

正文完
 0