题解 | #密码验证合格程序# JavaScript 版解法

密码验证合格程序

https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841

编写一个 helper 函数用于判断输入的字符串是否是合格的密码。需要经过三重检验:长度、字符种类数、长度大于 2 的包含公共元素的子串重复次数,根据检验结果返回答案。用到了字符串的 split、slice 方法和正则表达式。

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

function Hj20(ipt) {
    function helper(s) {
        if (s.length <= 8) return 'NG';
        // t1 t2 t3 t4 分别表示正则表达式匹配到的四种字符出现的次数
        let [t1, t2, t3, t4] = [0, 0, 0, 0], kind = 0;
        for (let i = 0; i < s.length; i++) {
            if (/[0-9]/.test(s.charAt(i))) t1++;
            if (/[a-z]/.test(s.charAt(i))) t2++;
            if (/[A-Z]/.test(s.charAt(i))) t3++;
            if (/[^0-9^a-z^A-Z]/.test(s.charAt(i))) t4++;
        }
        // 计算出现的字符种类数
        kind = (t1 ? 1 : 0) + (t2 ? 1 : 0) + (t3 ? 1 : 0) + (t4 ? 1 : 0);
        if (kind < 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 < ipt.length; i++) {
        console.log(helper(ipt[i]));
    }
}
#华为笔试##华为机试#
我的编程算法题 文章被收录于专栏

这是我在牛客上做的算法题的个人题解收录

全部评论
判断重复子串的逻辑好妙,我觉得这个条件的题意真的很难理解唉😔
2 回复 分享
发布于 2023-12-16 21:13 湖北

相关推荐

昨天 17:22
已编辑
西安交通大学 Java
华为 昇腾 ai软件开发 薪资20k x (14-16),职级13A,5%公积金,c/cpp
BLOOMING7:闭眼滴滴,华子给的又少又累
点赞 评论 收藏
分享
过往烟沉:我说什么来着,java就业面就是广!
点赞 评论 收藏
分享
评论
4
2
分享
牛客网
牛客企业服务