今天现场安全加固提了需求 要求加强系统的密码校验强度,具体要求如下:
- 连续递增或递减的数字不能超过三位及以上
- 连续递增或递减的的字母不能超过三位及以上(字母不区分大小写)
- 连续相同的数字不能超过三位及以上
- 连续相同的字母不能超过三位及以上(字母不区分大小写)
查了很多博客 发现都不太符合要求,所以自己写了一个:
function continuous(str){
var chars = str.toLowerCase().split('');
var preVal = 2; //前两个字符的差值
var nowVal = 0; //当前字符和前一个字符的差值
for(var i = 1; i < chars.length; i++ ){
var pre = chars[i-1].charCodeAt();
var now = chars[i].charCodeAt();
if(pre < 48 || (pre > 57 && pre < 97) || pre > 122
|| now < 48 || (now > 57 && now < 97) || now > 122){
preVal = 2;//如果当前字符或者前一个字符不是字母或数字,则差值直接设置为2
continue;
}
nowVal = now - pre;
if(nowVal === preVal){
if(nowVal === 0 || nowVal === 1 || nowVal === -1){
return true;
}
}
preVal = nowVal;
}
return false;
}
整段代码实现思路很简单 考虑3种情况:
- 连续相同字母或数字
- 连续递增字母或数字
- 连续递减字母或数字
那么如何统一的判断上面3种场景呢?
我们可以计算出每一个字符和它的前一个字符的ASCLL码差值
如果差值出现连续的1、0、-1则说明出现了上面3种情况的一种。需要注意只有当前字符和前一个字符是字母或数字的时候才需要进行差值计算。
上述代码的时间复杂度为O(N) 空间复杂度为O(1)