本题要求我们编写一个简单的密码强度检测器。一个密码被认为是“安全”的,需要同时满足三个条件:
A ~ Z);0 ~ 9)。输入包含 T 组测试数据,每组一个密码字符串。对于每个密码,判断它是否满足上述三个条件,如果满足则输出 Y,否则输出 N。
题目保证密码仅由大小写字母和数字组成,长度不超过 100,组数 T 不超过 100,因此数据规模很小,直接模拟即可。
对于每一个密码,我们需要检查它的三个属性:
isupper 函数或判断 ASCII 范围),标记为 true;isdigit 函数或判断 '0' <= c <= '9'),标记为 true。我们可以只进行一次遍历,同时检查大写字母和数字的存在情况。最后根据长度、大写标记和数字标记的综合结果输出 Y 或 N。
password。has_upper = false 和 has_digit = false。password 中的每个字符:
has_upper 置为 true;has_digit 置为 true。password.length() >= 8 且 has_upper == true 且 has_digit == true,输出 Y;否则输出 N。因为一旦找到一个满足条件的字符就可以停止检查吗?可以,但本题字符串长度最大仅 100,即使全遍历也毫无压力,因此直接完整遍历即可,代码也更简洁。
下面给出 C++ 代码,并附上详细注释。
cpp1#include <iostream> 2#include <string> 3using namespace std; 4 5int main() { 6 int T; 7 cin >> T; // 读入测试组数 8 while (T--) { 9 string password; 10 cin >> password; // 读入当前密码 11 bool has_upper = false; // 是否含有大写字母 12 bool has_digit = false; // 是否含有数字 13 14 // 遍历密码中的每个字符 15 for (size_t i = 0; i < password.length(); ++i) { 16 if (isupper(password[i])) { // 是大写字母 17 has_upper = true; 18 } 19 if (isdigit(password[i])) { // 是数字 20 has_digit = true; 21 } 22 } 23 24 // 三个条件同时满足才安全 25 if (password.length() >= 8 && has_upper && has_digit) { 26 cout << "Y\n"; 27 } else { 28 cout << "N\n"; 29 } 30 } 31 return 0; 32}
代码中使用了 C++ 标准库函数 isupper 和 isdigit,它们分别用于判断字符是否为大写字母和数字。这两个函数需要包含 <cctype> 头文件,但在很多编译环境下 <iostream> 会间接包含它,为安全起见也可以显式 #include <cctype>。
对于每组密码,我们只需要对字符串进行一次遍历,单次判断的时间复杂度为 O(L),其中 L 是密码长度。题目中 L≤100,T≤100,因此总运算量非常小,可以在 1ms 的时间限制内轻松完成。
空间复杂度为 O(L),仅用于存储输入的字符串。
Y 和 N,不要写成小写。