题解:P5015 [NOIP2018 普及组] 标题统计
Malkin_Moonlight · · 题解
Knowledge
这道题适合刚学习字符串的萌新去做。
知识点:字符串、模拟、输入。
Summary
给你一个字符串,要求你过滤掉空格和换行,其余字符的长度。
这里给出几种做法,大家可以根据自己喜好选择做法。
Solution 1
直接使用 cin 读取字符串会在遇到空格和换行时停止读取,所以我们需要用 getline 函数来读取题目中的字符串
getline 代码示例,输入字符串
getline(cin, s);
读取字符串后我们需要看字符串的每一位,如果符合要求,那么就将计数变量
在判断是否符合要求时有两种方式判断。
第一种方式:正向思维,判断是否是大、小写英文字母、数字,代码如下。
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 函数,这个函数可以判断是否为大、小写英文字母和数字,是的话返回
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
}
还有一种好玩的方法,注意到 if 搭配 cin,代码如下。
if (cin >> c) ans++;
if (cin >> c) ans++;
if (cin >> c) ans++;
if (cin >> c) ans++;
if (cin >> c) ans++;
为什么我们可以直接用 if 判断呢,因为 cin 在读入数据的时候如果没有读取到返回 if 语句就不会成立,
Others
这篇题解我只给出了核心代码,防止有人抄题解。
记住,只有自己理解了,你才会进步。