Flowers Flourish from France 题解
题目传送门1 || 题目传送门2
题目大意
编写一个程序,检查输入的每个句子是否所有单词的首字母相同(忽略大小写),如果是则输出 Y
,否则输出 N
。输入以 *
结束。
输入有多个句子,每个句子由不超过 \(50\) 个单词组成,单词之间用单个空格分隔。
每个单词由不超过 \(20\) 个英文字母(大小写均可)组成,且至少包含一个字母。
解题方法
输入
由于这里要输入一整行,且中间有空格,可以使用 getline
来逐行读取输入。只要输入为 *
(getline
不会读取末尾回车哦)就跳出。
统一字母大小写
为了方便后续比较,可以将所有字母转为大写(或小写)。这里将所有字符改为大写,通过 s[i] -= ' ' 将小写字母转为大写(ASCII 特性)。
for (int i = 0; i < s.size(); i++)
if (s[i] >= 'a' && s[i] <= 'z') s[i] -= ' ';
检查首字母
- 建立几个变量,这里
tot
用来记录第一个单词的首字母,flag
用来记录所有单词首字母是否相同。 - 首先用变量
tot
记录第一个单词的首字母(即s[0]
)。 - 然后遍历句子,每当遇到空格时,检查下一个字符是否为
tot
。 - 如果发现不一致,设置
flag = 1
并提前退出循环。
char tot = s[0];
bool flag = 0;
for (int i = 1; i < s.size(); i++) {
if (s[i - 1] == ' ' && s[i] != tot) {
flag = 1;
break;
}
}
完成这几个部分以后,这道题就可以很轻松解决了~
参考代码
#include<bits/stdc++.h>
#define int long long
#define rint register long long
#define fast_running ios::sync_with_stdio(false),std::cin.tie(0),std::cout.tie(0);
using namespace std;
signed main() {
fast_running;
string s;
while (1) {
getline(cin, s); // 读取一行输入
if (s == "*") break; // 遇到 "*" 结束输入
// 将所有字母转为大写(方便比较)
for (rint i = 0; i < s.size(); i++) {
if (s[i] >= 'a' && s[i] <= 'z') s[i] -= ' ';
}
char tot = s[0]; // 记录第一个单词的首字母
bool flag = 0; // 标记是否出现不一致的情况
// 遍历句子,检查每个单词的首字母
for (rint i = 1; i < s.size(); i++) {
if (s[i - 1] == ' ' && s[i] != tot) { // 遇到空格后的字母与 tot 不同
flag = 1;
break;
}
}
// 输出结果
if (flag == 0) cout << "Y\n";
else cout << "N\n";
}
return 0;
}