题目的主要信息:

  • 密码按如下规则进行计分,并根据不同的得分为密码进行安全等级划分:
  1. 密码长度:
    • 5 分: 小于等于4 个字符

    • 10 分: 5 到7 字符

    • 25 分: 大于等于8 个字符

  2. 字母:
    • 0 分: 没有字母

    • 10 分: 全都是小(大)写字母

    • 20 分: 大小写混合字母

  3. 数字:
    • 0 分: 没有数字

    • 10 分: 1 个数字

    • 20 分: 大于1 个数字

  4. 符号:
    • 0 分: 没有符号

    • 10 分: 1 个符号

    • 25 分: 大于1 个符号

  5. 奖励:
    • 2 分: 字母和数字

    • 3 分: 字母、数字和符号

    • 5 分: 大小写字母、数字和符号

  • 根据得分输出如下:
得分 输出
得分>= 90 VERY_SECURE
得分>= 80 SECURE
得分>= 70 VERY_STRONG
得分>= 60 STRONG
得分>= 50 AVERAGE
得分>= 25 WEAK
得分>= 0 VERY_WEAK

方法一:统计得分和

具体做法:

遍历输入的字符串,统计小写字母、大写字母、数字、其他字符出现的次数,然后分别根据长度、大小写字母情况,数字情况,字符情况,奖励情况累加得分,最后根据累加分数区间输出相应的结果。

注意,奖励得分需要从最严苛的开始判断,因为它们是相互包含关系。

alt

#include<iostream>
#include<string>
using namespace std;

int cal_score(string& s){
    int sum = 0;
    int upletter = 0;
    int lowletter = 0;
    int digit = 0;
    int other = 0;
    for(int i = 0 ; i < s.length(); i++){ //遍历数组统计每种字符串出现的次数
        if(s[i] >= 'a' && s[i] <= 'z')
            lowletter++;
        else if(s[i] >= 'A' && s[i] <= 'Z')
            upletter++;
        else if(s[i] >= '0' && s[i] <= '9')
            digit++;
        else
            other++;
    }
    if(s.length() <= 4) //长度的分
        sum += 5;
    else if(s.length() <= 7)
        sum += 10;
    else
        sum += 25;
    if(upletter == 0 || lowletter == 0) //字母得分
        sum += 10;
    else if(upletter > 0 && lowletter > 0)
        sum += 20;
    if(digit == 1) //数字得分
        sum += 10;
    else if(digit > 1)
        sum += 20;
    if(other == 1) //符号得分
        sum += 10;
    else if(other > 1)
        sum += 25;
    if(upletter > 0 && lowletter > 0 && digit > 0 && other > 0) //奖励得分
        sum += 5;
    else if(upletter + lowletter > 0 && digit > 0 && other > 0)
        sum += 3;
    else if(upletter + lowletter > 0 && digit > 0)
        sum += 2;
    return sum;
}

int main(){
    string s;
    while(cin >> s){
        int score = cal_score(s); //计算得分
        switch(score / 10){ //分数以十位划分
           case 9: cout << "VERY_SECURE" <<endl; break;
           case 8: cout << "SECURE" << endl; break;
           case 7: cout << "VERY_STRONG" << endl; break;
           case 6: cout << "STRONG" << endl; break;
           case 5: cout << "AVERAGE" << endl; break;
           default:{ //50以下两种情况
               if(score >= 25)
                   cout << "WEAK" << endl;
               else 
                   cout << "VERY_WEAK" << endl;
           }
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),遍历一次字符串,其他都是判断
  • 空间复杂度:O(1)O(1),无额外空间

方法二:类

具体做法:

我们可以用一个类封装这个字符串,用输入的字符串初始化这个密码类,同时统计小写字母、大写字母、数字、其他字符出现的次数。后续每种情况都是一个成员函数,在主函数中调用成员函数累加即可计算得分,根据得分区间输出即可。

#include<iostream>
#include<string>
using namespace std;

class password_score{
private:
    string password;
    int upletter = 0;
    int lowletter = 0;
    int digit = 0;
    int other = 0;

public:
    void init(string s){
        this->password = s; //初始化类的字符串
        for(int i = 0; i < s.length(); i++){ //遍历数组统计每种字符串出现的次数
            if(s[i] >= 'a' && s[i] <= 'z')
                this->lowletter++;
            else if(s[i] >= 'A' && s[i] <= 'Z')
                this->upletter++;
            else if(s[i] >= '0' && s[i] <= '9')
                this->digit++;
            else
                this->other++;
        } 
    }
    
    int length_fun(){ //长度的分
        if(this->password.length() <= 4) 
            return 5;
        else if(this->password.length() <= 7)
            return 10;
        return 25;
    }
    
    int alpha_fun(){
        if(this->upletter == 0 || this->lowletter == 0) //字母得分
            return 10;
        else if(this->upletter > 0 && this->lowletter > 0)
            return 20;
        return 0;
    }
    
    int digit_fun(){
        if(this->digit == 1) //数字得分
            return 10;
        else if(this->digit > 1)
            return 20;
        return 0;
    }
    
    int other_fun(){
        if(this->other == 1) //符号得分
            return 10;
        else if(this->other > 1)
            return 25;
        return 0;
    }
    
    int award_fun(){
        if(this->upletter > 0 && this->lowletter > 0 && this->digit > 0 && this->other > 0) //奖励得分
            return 5;
        else if(this->upletter + this->lowletter > 0 && this->digit > 0 && this->other > 0)
            return 3;
        else if(this->upletter + this->lowletter > 0 && this->digit > 0)
            return 2;
        return 0;
    }
};


int main(){
    string s;
    while(cin >> s){
        password_score pw; //构建一个密码类
        pw.init(s); //用输入的字符串初始化
        int score = pw.alpha_fun() + pw.award_fun() + pw.digit_fun() + pw.length_fun() + pw.other_fun();
        switch(score / 10){ //分数以十位划分
           case 9: cout << "VERY_SECURE" <<endl; break;
           case 8: cout << "SECURE" << endl; break;
           case 7: cout << "VERY_STRONG" << endl; break;
           case 6: cout << "STRONG" << endl; break;
           case 5: cout << "AVERAGE" << endl; break;
           default:{ //50以下两种情况
               if(score >= 25)
                   cout << "WEAK" << endl;
               else 
                   cout << "VERY_WEAK" << endl;
           }
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(n)O(n),初始化字符串的时候需要遍历,其余都是判断
  • 空间复杂度:O(1)O(1),构建类的构建是常熟空间