解题思路
这是一道密码验证题目,需要检查以下条件:
-
密码规则:
- 只能由大写字母、小写字母、数字构成
- 不能以数字开头
- 必须至少包含两种字符类型
- 长度至少为8
-
验证步骤:
- 检查长度是否大于等于8
- 检查首字符是否为数字
- 统计各类字符数量
- 检查是否包含非法字符
- 检查字符类型是否满足要求
代码
#include <iostream>
#include <string>
using namespace std;
bool checkPassword(const string& pwd) {
// 检查长度
if (pwd.length() < 8) return false;
// 检查首字符
if (isdigit(pwd[0])) return false;
// 统计字符
int upper = 0, lower = 0, digit = 0;
for (char c : pwd) {
if (isupper(c)) upper++;
else if (islower(c)) lower++;
else if (isdigit(c)) digit++;
else return false; // 非法字符
}
// 检查字符类型数量
int types = (upper > 0) + (lower > 0) + (digit > 0);
return types >= 2;
}
int main() {
int n;
cin >> n;
while (n--) {
string pwd;
cin >> pwd;
cout << (checkPassword(pwd) ? "YES" : "NO") << endl;
}
return 0;
}
import java.util.Scanner;
public class Main {
public static boolean checkPassword(String pwd) {
// 检查长度
if (pwd.length() < 8) return false;
// 检查首字符
if (Character.isDigit(pwd.charAt(0))) return false;
// 统计字符
int upper = 0, lower = 0, digit = 0;
for (char c : pwd.toCharArray()) {
if (Character.isUpperCase(c)) upper++;
else if (Character.isLowerCase(c)) lower++;
else if (Character.isDigit(c)) digit++;
else return false; // 非法字符
}
// 检查字符类型数量
int types = (upper > 0 ? 1 : 0) + (lower > 0 ? 1 : 0) + (digit > 0 ? 1 : 0);
return types >= 2;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
while (n-- > 0) {
String pwd = sc.next();
System.out.println(checkPassword(pwd) ? "YES" : "NO");
}
}
}
def check_password(pwd):
# 检查长度
if len(pwd) < 8:
return False
# 检查首字符
if pwd[0].isdigit():
return False
# 统计字符
upper = sum(1 for c in pwd if c.isupper())
lower = sum(1 for c in pwd if c.islower())
digit = sum(1 for c in pwd if c.isdigit())
# 检查是否包含非法字符
if len(pwd) != upper + lower + digit:
return False
# 检查字符类型数量
types = (upper > 0) + (lower > 0) + (digit > 0)
return types >= 2
def main():
n = int(input())
for _ in range(n):
pwd = input().strip()
print("YES" if check_password(pwd) else "NO")
if __name__ == "__main__":
main()
算法及复杂度
- 算法:字符串处理
- 时间复杂度:
-
为密码数量,
为密码长度
- 空间复杂度:
- 只需要常数级别的额外空间