题目的主要信息:

密码按如下规则进行:

一、密码长度:

  • 5 分: 小于等于4 个字符
  • 10 分: 5 到7 字符
  • 25 分: 大于等于8 个字符

二、字母:

  • 0 分: 没有字母
  • 10 分: 全都是小(大)写字母
  • 20 分: 大小写混合字母

三、数字:

  • 0 分: 没有数字
  • 10 分: 1 个数字
  • 20 分: 大于1 个数字

四、符号:

  • 0 分: 没有符号
  • 10 分: 1 个符号
  • 25 分: 大于1 个符号

五、奖励:

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

最后根据得分得到密码强度等级。

方法一:

遍历一遍输入的字符串:

  1. 根据密码长度计算得分。
  2. 统计小写字母、大写字母、数字、其他字符出现的次数。
  3. 计算字母得分。
  4. 计算数字得分。
  5. 计算字符得分。
  6. 计算奖励得分。
  7. 根据分数输出相应的结果。 alt 具体做法:
#include<iostream>
#include<string>
#include <cstdio>
using namespace std;
int main(){
    string s;
    while(getline(cin,s)){
        int score=0;//分数
        //密码长度
        if(s.size()<=4){
            score+=5;
        }else if(s.size()>=8){
            score+=25;
        }else{
            score+=10;
        }
        //字母 数字  符号个数
        int lower=0,upper=0,digit=0,symbol=0,judge_zm=0,judge_fh=0;
        for(int i=0;i<s.size();i++){
            if(islower(s[i])){//小写字母
                lower++;
            }else if(isupper(s[i])){//大写字母
                upper++;
            }else if(isdigit(s[i])){//数字
                digit++;
            }else{//符号
                symbol++;
            }
        }
        //字母
        if((lower >0 && upper==0)||(lower ==0 && upper>0)){//全都是小(大)写字母
            score+=10;
        }else if(lower>0 && upper>0){//大小写混合字母
            score+=20;
        }
        //数字
        if(digit==1){//1个数字
            score+=10;
        }else if(digit>1){//大于1个数字
            score+=20;
        }
        //符号
        if(symbol==1){//1个符号
             score+=10;
        }else if(symbol>1){//大于1个符号
            score+=25;
        }
        //奖励
       if(lower>0 && upper>0 && digit>0 && symbol>0){//大小写字母、数字、符号
            score+=5;
        }else if((lower>0||upper>0) && (digit>0) && (symbol>0)){//字母、数字、符号
            score+=3;
        }else if((lower>0||upper>0) && (digit>0)){//字母和数字
            score+=2;
        } 
        
        if(score>=90){
            cout<<"VERY_SECURE"<<endl;
        }else if(score>=80){
            cout<<"SECURE"<<endl;
        }else if(score>=70){
            cout<<"VERY_STRONG"<<endl;
        }else if(score>=60){
            cout<<"STRONG"<<endl;
        }else if(score>=50){
            cout<<"AVERAGE"<<endl;
        }else if(score>=25){
            cout<<"WEAK"<<endl;
        }else{
            cout<<"VERY_WEAK"<<endl;
        }
    }
    return 0;
}

复杂度分析:

  • 时间复杂度:O(1)O(1),没有循环,只进行简单判断。
  • 空间复杂度:O(1)O(1),只用了常数空间。

方法二:

创建一个PW类,将所有计算密码得分的方法都封装成PW类的一个函数,计算密码强度等级的时候,首先调用各个分数计算函数累积起来,最后对总得分按范围划分等级。

具体做法:

#include<iostream>
#include<string>

using namespace std;

class PW{
private:
    string password;
    int upper = 0;
    int lower = 0;
    int digit = 0;
    int symbol = 0;

public:
    void init(string s){
        this->password = s; 
        for(int i = 0; i < s.size(); i++){ //统计大小写字母、数字、符号出现的次数
            if(islower(s[i])){//小写字母
                this->lower++;
            }else if(isupper(s[i])){//大写字母
                this->upper++;
            }else if(isdigit(s[i])){//数字
                this->digit++;
            }else{//符号
                this->symbol++;
            }
        } 
    }
    
    int scoreOfLen(){ //计算长度得分
        if(this->password.size() <= 4) 
            return 5;
        else if(this->password.size() <= 7)
            return 10;
        return 25;
    }
    
    int scoreOfAlpha(){//计算字母得分
        if(this->upper == 0 || this->lower == 0){ 
            return 10;
        }
        else if(this->upper > 0 && this->lower > 0){
            return 20;
        }
        return 0;
    }
    
    int scoreOfDigit(){//计算数字得分
        if(this->digit == 1)
            return 10;
        else if(this->digit > 1)
            return 20;
        return 0;
    }
    
    int scoreOfSymbol(){//计算符号得分
        if(this->symbol == 1){ 
            return 10;
        }
        else if(this->symbol > 1){
            return 25;
        }
        return 0;
    }
    
    int award(){//计算奖励分数
        if(this->upper > 0 && this->lower > 0 && this->digit > 0 && this->symbol > 0)//同时有大小写字母、数字、符号
            return 5;
        else if(this->upper + this->lower > 0 && this->digit > 0 && this->symbol > 0)//有字母、数字、符号
            return 3;
        else if(this->upper + this->lower > 0 && this->digit > 0)//有字母、数字
            return 2;
        return 0;
    }
};


int main(){
    string s;
    while(cin >> s){
        PW str; 
        str.init(s); 
        int score = str.award() + str.scoreOfLen() + str.scoreOfAlpha() + str.scoreOfDigit() + str.scoreOfSymbol();//计算总分
        //按照分数输出对应的密码强度等级
         if(score>=90){
            cout<<"VERY_SECURE"<<endl;
        }else if(score>=80){
            cout<<"SECURE"<<endl;
        }else if(score>=70){
            cout<<"VERY_STRONG"<<endl;
        }else if(score>=60){
            cout<<"STRONG"<<endl;
        }else if(score>=50){
            cout<<"AVERAGE"<<endl;
        }else if(score>=25){
            cout<<"WEAK"<<endl;
        }else{
            cout<<"VERY_WEAK"<<endl;
        }
    }
    return 0;
}


复杂度分析:

  • 时间复杂度:O(1)O(1),没有循环,只进行简单判断。
  • 空间复杂度:O(1)O(1),只用了常数空间。