题解:P5015 [NOIP2018 普及组] 标题统计

· · 题解

Knowledge

这道题适合刚学习字符串的萌新去做。

知识点:字符串、模拟、输入。

Summary

给你一个字符串,要求你过滤掉空格和换行,其余字符的长度。

这里给出几种做法,大家可以根据自己喜好选择做法。

Solution 1

直接使用 cin 读取字符串会在遇到空格和换行时停止读取,所以我们需要用 getline 函数来读取题目中的字符串 s

getline 代码示例,输入字符串 s

getline(cin, s);

读取字符串后我们需要看字符串的每一位,如果符合要求,那么就将计数变量 ans 加上 1,最后输出 ans 即可。

在判断是否符合要求时有两种方式判断。

第一种方式:正向思维,判断是否是大、小写英文字母、数字,代码如下。

if (s[i] >= 'a' && s[i] <= 'z') { //小写字母 
    ans++;
}
if (s[i] >= 'A' && s[i] <= 'Z') { //大写字母 
        ans++;
}
if (s[i] >= '0' && s[i] <= '9') { //数字 
        ans++;
}

第二种方式:逆向思维,排除不符合要求的就只剩符合要求的了,也就是说判断是不是空格和换行,代码如下。

if (s[i] != ' ' && s[i] != '\n') {
        ans++;
}

第三种方式:用库中的函数来偷懒,我们使用的是 isalnum 函数,这个函数可以判断是否为大、小写英文字母和数字,是的话返回 0,不是的话就返回一个非零的数,正好符合这个题目的意思,代码如下。

if (isalnum(s[i]) != 0) ans++;

第四种方式:也是使用库中的函数来判断,代码如下。

if (isdigit(s[i])) ans++; //判断是否是数字
if (islower(s[i])) ans++; //判断是否是小写字母
if (isupper(s[i])) ans++; //判断是否是大写字母
if (isalpha(s[i])) ans++; //判断是否为字母

Solution 2

边输入边处理,这样就不会被空格和换行所困扰。

这里我们使用 while 搭配 cin 来实现该操作,代码如下。

while (cin >> c) {
        //里面就是判断是否为大、小写英文字母、数字
        //判断方式见 Solution 1 
}

还有一种好玩的方法,注意到 1 ≤ |s| ≤ 5,这说明最多才 5 个字符,所以我们可以直接输入五次,这里我们使用 if 搭配 cin,代码如下。

if (cin >> c) ans++;
if (cin >> c) ans++;
if (cin >> c) ans++;
if (cin >> c) ans++;
if (cin >> c) ans++;

为什么我们可以直接用 if 判断呢,因为 cin 在读入数据的时候如果没有读取到返回 0,那么这个 if 语句就不会成立,ans 就不会加 1

Others

这篇题解我只给出了核心代码,防止有人抄题解。

记住,只有自己理解了,你才会进步。