题解 | #密码验证合格程序#
密码验证合格程序
https://www.nowcoder.com/practice/184edec193864f0985ad2684fbc86841
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()){
// 判断长度,若小于等于8也就是没有超过8,则输出NG,并跳出本次读行操作
if(line.length <= 8) {
console.log('NG');
continue;
}
// 判断密码是否有三种及三种以上的符号
let chargeSet = new Set();
for(let i = 0; i < line.length; i++) {
// 如果大于等于3种了则直接跳出for循环
if(chargeSet.size >= 3) {
break;
}
// 判断是否为数字
if(line.charCodeAt(i) >= 48 && line.charCodeAt(i) <= 57) {
chargeSet.add('number');
}
// 判断是否为小写字符
else if(line.charCodeAt(i) >= 65 && line.charCodeAt(i) <= 90) {
chargeSet.add('upchar');
}
// 判断是否为大写字符
else if(line.charCodeAt(i) >= 97 && line.charCodeAt(i) <= 122) {
chargeSet.add('lowchar');
}
// 其他
else {
chargeSet.add('others');
}
}
// 最后如果小于3种则输出NG
if(chargeSet.size < 3) {
console.log('NG');
continue;
}
// 判断是否有字串,我们只需要判断长度为3的子串就可以了
chargeSet = new Set();
// 判断不符合的次数
let ngTimes = 0;
// 由于判断的子串长度为3,则需要减少两次循环
for(let i = 0; i < line.length -2; i++) {
// 如果不符合了,直接跳出循环
if(ngTimes!=0) {
break;
}
// 子串
let kidStr = line.slice(i,i+3);
// 判断是否有该子串,没有则加入我们的chargeSet里
if(chargeSet.has(kidStr)) {
// 有该子串,则输出NG,让ngTimes自增一次,并结束该次循环
// 下次循环中则发现ngTimes不为0,不再循环
console.log('NG');
ngTimes++;
continue;
}
else {
chargeSet.add(kidStr);
}
}
// 判断第三个条件是否输出过ngTimes,没有则表明三个条件都满足了,则可以输出OK
if(ngTimes==0) {
console.log('OK');
}
}
}()


