【JavaScript】华为机试_HJ20_密码验证合格程序

题目描述

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

合格的密码要求:

(1)长度不少于8位

(2)必须包含大写字母、小写字母、数字、特殊字符中的至少三种

(3)不能分割出两个独立的、长度大于2的连续子串,使得这两个子串完全相同

题目链接:https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841?tpId=37\&tqId=21243\&rp=1\&sourceUrl=%2Fexam%2Foj%2Fta%3FtpId%3D37\&difficulty=undefined\&judgeStatus=undefined\&tags=\&title=

解答

第一次通过示例

javascript 复制代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        let res = "OK";
        let count = 0;
        if (line.length < 8) {
            console.log("NG");
            continue;
        }
        count = line.match(/[A-Z]/) ? ++count : count;
        count = line.match(/[a-z]/) ? ++count : count;
        count = line.match(/[0-9]/) ? ++count : count;
        count = line.match(/[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E]/) ? ++count : count;
        if (count < 3) {
            console.log("NG");
            continue;
        }
        for (let i = 0; i < line.length - 5; i++) {
            let substr = line.slice(i, i+3);
            if (i > 0 && line.slice(0, i).includes(substr)) {
                res = "NG";
                break;
            } else if (i+3 < line.length && line.slice(i+3).includes(substr)) {
                res = "NG";
                break;
            }
        }
        console.log(res);
    }
}()

优化

javascript 复制代码
const rl = require("readline").createInterface({ input: process.stdin });
var iter = rl[Symbol.asyncIterator]();
const readline = async () => (await iter.next()).value;

void async function () {
    // Write your code here
    while(line = await readline()){
        if (isPassword(line)) {
            console.log("OK");
        } else {
            console.log("NG");
        }
    }
}()

function isPassword (pwd) {
    if (!pwd || pwd.length < 8) return false;

    let matchCount = 0;
    const regs = [/\d/g, /[A-Z]/g, /[a-z]/g, /\W/g];
    regs.forEach( reg => matchCount = reg.test(pwd) ? ++matchCount : matchCount);
    if (matchCount < 3) return false;
    
    for (let i = 0; i < pwd.length - 5; i++) {
        const substr = pwd.slice(i, i+3);
        if (pwd.slice(i+3).includes(substr)) return false;
    }
    return true;
}
相关推荐
caoerzhong3 分钟前
JeeWMS 开源 WMS 部署避坑指南:Java 仓库管理系统的环境基线、四类根因与可复现交付
java·开发语言·开源
时间的拾荒人5 分钟前
Qt 界面优化:绘图详解 —— 从基础图形到图片处理
开发语言·qt·面试
MayZork23 分钟前
Qt 文件操作:QSaveFile 与 QTemporaryFile(含 QTemporaryDir)实战
开发语言·qt
北冥you鱼35 分钟前
Go 语言空接口(interface{})使用场景与最佳实践
开发语言·windows·golang
xh didida1 小时前
Linux -- 基础IO
linux·服务器·开发语言·c++
垆边人似月.1 小时前
华为机试题 :两数之和
c++·算法·华为
个 人 练 习 生1 小时前
C++ string 类模拟实现:从底层理解字符串(上)
开发语言·c++·经验分享·学习·程序人生
垆边人似月.1 小时前
华为机试题 :有效的括号
c++·算法·华为
2601_966949651 小时前
多市场量化策略的数据接口应该如何设计:从数据层架构到策略接入
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
小宋10211 小时前
A2UI从零实战:Agent安全生成交互界面与事件回传
javascript·人工智能·安全·交互