P1043. 弱密码检验

zhangxiaodiWW / 2023-08-15 / 原文

这道题,我看到大家做的情况我就知道不简单

WA惨无人道啊

所以这就是今天这个随笔的内容

先看题目

一些网站在设置密码的时候都会判断你的密码是否为弱密码,通常从字符种类,密码长度等作为判断的依据。但是有的时候密码中包含连续的数字也是弱密码,例如 Aa123456789 这样的密码也应该被判定为弱密码。现在需要你来实现一个程序,用于判断一个字符串里面是否有连续的数字。

连续数字的定义:

  1. 一直递增的数字,且每次只递增 1;或者一直递减,且每次递减 1,例如 123,34567 ,7654 等。注意 343,3456765 不是连续数字,因为没有一直递增或者一直递减;12456 也不是连续数字,因为中间的 2 和 4 不是递增 1,而是增加了 2;78910 不是连续数字,注意 9 后面不能和 0 或者 10 相连。
  2. 长度大于等于 3,例如 12 不被判定为连续数字,因为它的长度太短了。

输入格式

第一行输入一行一个正整数 t,表示测试数据的组数(1t1000)

接下来 t 行,每行一个长度不超过 20 的字符串,表示一个密码,密码均由可见字符组成,不包含空格和换行符。

输出格式

对于每一组测试数据,输出 yes 或者 no(均为小写)表示给定的密码中是否至少含有一段连续的数字。

输入数据 1

4
abc123aee22
abc12321a
lxsb321yyy
flww12345677
 

输出数据 1

yes
no
yes
no
 

说明

第一个样例包含两段数字,分别是 123 和 22,其中 123 是连续数字,所以输出 yes。

第二个样例包含一段连续的数字是 12321,根据定义,这段数字不是一直递增也不是一直递减,所以不是连续的数字,输出 no。

第三个样例包含一段数字 321,是连续数字,输出 yes。

第四个样例包含一段数字 12345677,最后两个不是递增,所以输出 no。

 

思路:

这道题只要以字母分段,然后提出数字,最后判断递增或递减就可以了

代码:

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

bool isConsecutive(string digit) {
    if (digit.length() < 3) {
        return false;
    }

    bool isIncreasing = true;
    bool isDecreasing = true;

    for (int i = 1; i < digit.length(); i++) {
        if (digit[i] != digit[i - 1] + 1) {
            isIncreasing = false;
        }
        if (digit[i] != digit[i - 1] - 1) {
            isDecreasing = false;
        }
    }

    return isIncreasing || isDecreasing;
}

int main() {
    int t;
    cin >> t;

    while (t--) {
        string password;
        cin >> password;

        string digit;
        bool hasConsecutive = false;

        for (char c : password) {
            if (isdigit(c)) {
                digit += c;
            } else {
                if (isConsecutive(digit)) {
                    hasConsecutive = true;
                    break;
                }
                digit = "";
            }
        }

        if (isConsecutive(digit)) {
            hasConsecutive = true;
        }

        if (hasConsecutive) {
            cout << "yes" << endl;
        } else {
            cout << "no" << endl;
        }
    }

    return 0;
}

我一开始一直在判断连起来的数字,所以一直出错,我真(lll¬ω¬)