标题计数题解~
背景
作者是一只普及组蒟蒻,这次比赛只拿了200分,普及组一等奖有点悬啊(悲
我的考场思路(仅供参考)
先把是一级标题和不是一级标题的拿出来分个类
是一级标题的
1.# This is a title//#号在开头并且后面有空格,最标准的一种
2.# This is another title//#号后面有多个空格的
3. # This is also a title//#号是除空格外第一个字符的
4. # You#can#add#more#sharps//#号后面的空格的后面还有多个#号
5.# #//#号后面的空格的后面只有单个#号
不是一级标题的
6.<h1>an HTML title</h1>//最不标准,#号都没有出现
7.#You should insert a space//#号后面没有空格
8.## This is a secondary title//两个#号连在一起的
9.aaaaa # This is not a title at all//#号前有非空格字符的
10. # //虽然#号后有空格,但是没有除空格外任意字符
我的思路来了:
大体思路:
因为我们找到一个#号光判断后面有没有空格是不够的,所以如果我们找到了#号后面有空格并且#号前面没有除空格外其他字符,只能筛掉6,7,8,9情况,但是10情况没有被判断。
所以当我们符合上述条件时,flag = true,如果找到了除空格外其他字符并且flag == true,就是完全符合条件的一个标题了。
//如果还没有思路,继续往下看看代码思路,如果有了思路,把它转换为代码思路吧!
代码思路:
遍历这个string的时候忽略空格,找到第一个#号,如果第一个#号后面紧跟着非空格字符就是不符合条件的(筛掉了情况7,8),跳出遍历。如果符合条件,flag = true,并且继续遍历。如果找到了其他字符并且flag == true,就说明#号后面除空格外有其他字符(筛掉情况10),如果flag == false,就说明#号还没出现除空格外字符就来了,不符合条件,跳出遍历。(筛掉6,9)
不是一级标题的全筛完啦!剩下的就都是一级标题了。
//看到这里觉得你行了,自己去写写看好吗?如果还是感觉有点模糊,请看正式题解
正式开始题解
//
// main.cpp
// U230287 标题计数
//
// Created by SkyWave Sun on 2022/9/4.
//
#include <iostream>
using namespace std;
string str[11];
int main(int argc, const char * argv[]) {
int n;
scanf("%d\n",&n);//用scanf可以读掉换行,cin>>n;再getchar();
for (int i = 0; i<n; ++i) {
getline(cin, str[i]);//读入每一行
}
unsigned long long sum = 0;
for (int i = 0; i<n; ++i) {
unsigned short len = str[i].length();
bool flag1 = false;
bool flag2 = false;
for (int j = 0; j<len; ++j) {
if (str[i].at(j) == ' ') {
//空的if写了干嘛?答:因为好看
}else if (str[i].at(j) == '#') {
if (flag1) {
flag2 = true;
break;
}//flag1就是表示存在一种情况为除了空格外第一个字符是#并且#后面是空格,但是我们仍需要遍历整个字符串来判断#号后到底有没有字符,如果#号后都是空格是不满足题意的。# #(中间有空格)也是符合题意的,所以如果一行中再次出现#并且flag1 == true就说明这一行是一个一级标题。
if (j == len - 1) break;//如果#在最末尾,下一行的判断会越界,而且这种情况也是不符合条件的
if (str[i].at(j+1) == ' ')//这种就是前面说的如果#是第一个除空格外的字符且#的后面是空格就打上标记 flag1 = true;
else break;//如果不是,那就不符合条件,不是一级标题
}else {
if (flag1) flag2 = true;
break;//这里就表示flag == 1 并且一行中有除空格外其他字符就表示是一级标题
}
}
if (flag1 && flag2) ++sum;//两种情况都符合才统计一种情况
}
printf("%llu\n",sum);
return 0;
}
总结
这道题一定要细心细心再细心,把每种情况都考虑上了,样例全跑一遍并且确保自己不只是答案撞对了。
在学校一直以粗心为名的我最完这道题甚至把题目描述的markdown都复制过来跑了一遍,确认无误才敢交。
完结撒花!