描述

题目描述

首先给我们一个多组输入,然后我们去判断有多少个数字,有多少个大写字母,多少个小写字母,多少个字符

然后根据以下规则进行给分

一、密码长度:

5 分: 小于等于4 个字符

10 分: 5 到7 字符

25 分: 大于等于8 个字符

二、字母:

0 分: 没有字母

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

20 分: 大小写混合字母

三、数字:

0 分: 没有数字

10 分: 1 个数字

20 分: 大于1 个数字

四、符号:

0 分: 没有符号

10 分: 1 个符号

25 分: 大于1 个符号

五、奖励(只能选符合最多的那一种奖励):

2 分: 字母和数字

3 分: 字母、数字和符号

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

然后根据我们最后的得分给定一个等级

最后的评分标准:

>= 90: 非常安全 VERY_SECURE

>= 80: 安全 VERY_SECURE

>= 70: 非常强 VERY_STRONG

>= 60: 强 STRONG

>= 50: 一般 AVERAGE

>= 25: 弱 WEAK

>= 0:  非常弱 VERY_WEAK

模拟的思路图解

20220301192706

题解

解法一:直接模拟

实现思路

手续爱你我们可以是直接模拟我们的这个过程,我们去判断有多少个大写字母,小写字母,数字,符号,然后我们分别根据我们的这几个规则进行一个给定的判断,最后再依据分数来进行一个输出

代码实现

#include <bits/stdc++.h>

using namespace std;

signed main() {
    string s;
    while (getline(cin, s)) {
        int length = 0, lowCharater = 0, supCharater = 0, sym = 0, num = 0, res = 0;
        // length是字符串长度,low是小写字母数量,sup是大写字母数量,sym是符号的数量, num是数字的数量,res是最后的分数
        // 首先判断我们长度
        length = s.size();
        if (length <= 4) res += 5;
        else if (length >= 5 && length <= 7) res += 10;
        else res += 25;
        
        // 判断字母和数字和符号
        for (auto &it : s) {
            if (islower(it)) lowCharater += 1;
            else if (isupper(it)) supCharater += 1;
            else if (isdigit(it)) num += 1;
            else if (it != ' ') sym += 1;
        }

        // 判断字母的奖励
        if (lowCharater && supCharater) res += 20;
        else if (lowCharater || supCharater) res += 10;

        // 判断数字的奖励
        if (num > 1) res += 20;
        else if (num == 1) res += 10;

        // 判断符号的奖励
        if (sym > 1) res += 25;
        else if (sym == 1) res += 10;

        // 额外的奖励
        if (lowCharater && supCharater && num && sym) res += 5;
        else if ((lowCharater || supCharater) && num && sym) res += 3;
        else if ((lowCharater || supCharater) && num) res += 2;

        // 计算对应的等级
        if (res >= 90) {
            cout << "VERY_SECURE\n";
        } else if (res >= 80) {
            cout << "SECURE\n";
        } else if (res >= 70) {
            cout << "VERY_STRONG\n";
        } else if (res >= 60) {
            cout << "STRONG\n";
        } else if (res >= 50) {
            cout << "AVERAGE\n";
        } else if (res >= 25) {
            cout << "WEAK\n";
        } else {
            cout << "VERY_WEAK\n";
        }
    }
    return 0;
}

时空复杂度分析

时间复杂度分析 : O(n)O(n)

理由如下: 我们把我们的字符串遍历了一次, 长度为nn, 但是这里由于我们的字符串长度最长也就是300300, 所以对这个题目而言, 我们可以简单的理解为是O(1)O(1)的, 但是根据这个程序而言, 他的时间复杂度是O(n)O(n)

空间复杂度 : O(1)O(1)

理由如下: 因为我们只是引用的常数级别的空间

解法二

实现思路

我们可以采用C++C++的类和对象的一个特性来编写我们的程序, 我们创建一个工具类, 然后我们在工具类里面使用各种函数来实现我们的计分和输出的操作

代码实现

#include <bits/stdc++.h>

using namespace std;

class ToolsForString {
   protected:
    int length = 0, lowCharater = 0, supCharater = 0, sym = 0, num = 0, res = 0;
    // length是字符串长度,low是小写字母数量,sup是大写字母数量,sym是符号的数量,
    // num是数字的数量,res是最后的分数
   public:
    ToolsForString() {}
    ToolsForString(string s) {
        // 判断字母和数字和符号
        for (auto &it : s) {
            if (islower(it)) lowCharater += 1;
            else if (isupper(it)) supCharater += 1;
            else if (isdigit(it)) num += 1;
            else if (it != ' ') sym += 1;
        }
        res = 0, length = s.size();
    }

    void priceForLength() {
        if (length <= 4) res += 5;
        else if (length >= 5 && length <= 7) res += 10;
        else res += 25;
    }

    void priceForCharater() {
        // 判断字母的奖励
        if (lowCharater && supCharater) res += 20;
        else if (lowCharater || supCharater) res += 10;
    }
    
    void priceForNumber() {
        // 判断数字的奖励
        if (num > 1) res += 20;
        else if (num == 1) res += 10;
    }

    void pirceForSymble() {
        // 判断符号的奖励
        if (sym > 1) res += 25;
        else if (sym == 1) res += 10;
    }

    void priceForExtend() {
        // 额外的奖励
        if (lowCharater && supCharater && num && sym) res += 5;
        else if ((lowCharater || supCharater) && num && sym) res += 3;
        else if ((lowCharater || supCharater) && num) res += 2;
    }

    void show() {
        // 计算对应的等级
        if (res >= 90) {
            cout << "VERY_SECURE\n";
        } else if (res >= 80) {
            cout << "SECURE\n";
        } else if (res >= 70) {
            cout << "VERY_STRONG\n";
        } else if (res >= 60) {
            cout << "STRONG\n";
        } else if (res >= 50) {
            cout << "AVERAGE\n";
        } else if (res >= 25) {
            cout << "WEAK\n";
        } else {
            cout << "VERY_WEAK\n";
        }
    }
};

signed main() {
    string s;
    while (getline(cin, s)) {
        ToolsForString tool(s);
        tool.priceForLength();
        tool.priceForCharater();
        tool.priceForNumber();
        tool.pirceForSymble();
        tool.priceForExtend();
        tool.show();
    }
    return 0;
}

时空复杂度分析

时间复杂度分析 : O(n)O(n)

理由如下: 我们把我们的字符串遍历了一次, 长度为nn, 但是这里由于我们的字符串长度最长也就是300300, 所以对这个题目而言, 我们可以简单的理解为是O(1)O(1)的, 但是根据这个程序而言, 他的时间复杂度是O(n)O(n)

空间复杂度 : O(1)O(1)

理由如下: 因为我们只是引用的常数级别的空间