编程题 - 密码验证合格程序【JavaScript/Node.js解法】

发布于:2025-03-06 ⋅ 阅读:(19) ⋅ 点赞:(0)

奋斗是万物之父。——陶行知

密码验证合格程序 题目:

你需要书写一个程序验证给定的密码是否合格。
合格的密码要求:

  • 长度超过 8位
  • 必须包含大写字母、小写字母、数字、特殊字符中的至少三种
  • 不能分割出两个独立的、长度大于 的连续子串,使得这两个子串完全相同;更具体地,如果存在两个长度大于 的独立子串 ,使得 ,那么密码不合法。

子串为从原字符串中,连续的选择一段字符(可以全选、可以不选)得到的新字符串。
可见字符集为 ASCII 码在 到 范围内的可见字符。您可以参阅下表获得其详细信息(您可能关注的内容是,这其中不包含空格、换行)。
在这里插入图片描述

输入描述:
本题将会给出1≦T≦10 组测试数据,确切数字未知,您需要一直读入直到文件结尾,每组测试数据描述如下:
在一行上输入一个长度为 1≦length(s)≦100 ,由可见字符构成的字符串s ,代表待判断的密码。
输出描述:
对于每一组测试数据,新起一行。若密码合格,输出 OK ,否则输出 NG 。
示例1:
输入:

021Abc9000
021Abc9Abc1
021ABC9000
021$bc9000
021Abc1111

输出:

OK
NG
NG
OK
OK

说明:
对于第二组测试数据,“Abc9Abc1” 中存在两个长度大于 2 的独立子串 “Abc”。对于第三组测试数据,仅包含大写字母和数字,不满足条件。
示例2:
输入:

Abc1@
A1@ababa@1A

输出:

NG
OK

说明:
对于第一组测试数据,长度不足 8 位,不满足条件。

题解:

验证输入的长度,<8直接输出NG
验证输入串的每个字符,满足ASCII码四个段(大小写字母,数字,其他字符)其中三个以上
每次拆分三个字符串,看数组中的元素有两个还是以上

JS/Nodejs解答:

const rl = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout,
});
const pasdArr = [];
rl.on('line', (line) => {
  pasdArr.push(line);
}).on('close', () => {
  testPassword(pasdArr);
})

function testPassword (pasdArr) {
  function testStr (s) {
    if (s.length <= 8) return 'NG';
    let [t1, t2, t3, t4] = [0, 0, 0, 0], count = 0;
    for (let i = 0; i < s.length; i++) {
      if (/[0-9]/.test(s.charAt(i))) t1++;
      if (/[a-z]/) t2++;
      if (/[A-Z]/) t3++;
      if (/[^0-9^a-z^A-Z]/) t4++;
    }
    count = (t1 ? 1 : 0) + (t2 ? 1 : 0) + (t3 ? 1 : 0) + (t4 ? 1 : 0);
    if (count < 3) return 'NG';
    // 判断是否有长度大于 2 的包含公共元素的子串重复
    for (let i = 0; i < s.length - 2; i++) {
      let b = s.split(s.slice(i, i + 3));
      if (b.length > 2) return 'NG'
    }
    return 'OK'
  }
  for (let i = 0; i < pasdArr.length; i++) {
    console.log(testStr(pasdArr[i]));
  }
}

通过案例:

在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到