解题思路

这是一道密码验证题目,需要检查以下条件:

  1. 密码规则:

    • 只能由大写字母、小写字母、数字构成
    • 不能以数字开头
    • 必须至少包含两种字符类型
    • 长度至少为8
  2. 验证步骤:

    • 检查长度是否大于等于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()

算法及复杂度

  • 算法:字符串处理
  • 时间复杂度: - 为密码数量, 为密码长度
  • 空间复杂度: - 只需要常数级别的额外空间