[英]Check if String has sequential or repeated characters in javascript (underscore)
我有我正在尝试重构的代码。 我是 javascript 的新手,所以我想使用下划线等库中的函数来制作更具可读性的代码。 下面的 function 可以检测字符串何时包含 3 个或更多有序字符,例如 (234, efg, LmN) 以及何时字符串包含 3 个或更多重复 (lll, 444, MMm, @@@)
const input = "Dfdf123125";
const myStr = input.toLowerCase();
const n = 3;
let isRepeating = false;
let isSequential = false;
for (let i = 0; i < myStr.length; i++) {
if (i + (n - 1) <= myStr.length) {
let isRepeatingTemp = false;
let isSequentialTemp = false;
for (let j = i; j < i + n; j++) {
(myStr.charCodeAt(i) === myStr.charCodeAt(j)) ? isRepeatingTemp = true: isRepeatingTemp = false;
(myStr.charCodeAt(i) === myStr.charCodeAt(j) - (n - 1)) ? isSequentialTemp = true : isSequentialTemp = false;
}
if (isRepeatingTemp) isRepeating = true;
if (isSequentialTemp) isSequential = true;
}
}
我试图看看我是否可以优化它并使用下划线使其更具可读性和/或什至使时间/空间复杂性更好。 我知道这也可以用 regx 来完成,但我试图在没有它的情况下完成它。
我没有使用内部for
循环,而是使用Array.prototype.slice()将字符串分块为n
以提前查看n
字符。 我使用Array.prototype.indexOf()根据abc
和num
常量( ref )来查找它是否是顺序的。 为了查看它是否重复,我使用Array.prototype.every()循环遍历块并检查它们是否相似并根据表达式返回 boolean。
结果给出了找到的每个实例的 output,以及它是连续的还是重复的。
const input = "Dfdf123125";
function RepSeq(str, n) {
var rep = false;
var seq = false;
var result = [];
const num = '0123456789';
const abc = 'abcdefghijklmnopqrstuvqxyz';
if (str.length < n) return false;
for (var i = 0; i < str.length; i++) {
if (i + n <= str.length) {
var chunk = str.slice(i, i + n);
var seqABC = abc.indexOf(chunk) > -1;
var seq123 = num.indexOf(chunk) > -1;
if (seq123 || seqABC) {
seq = true;
result.push(chunk);
}
if ([...chunk].every(v => v.toLowerCase() === chunk[0].toLowerCase())) {
rep = true;
result.push(chunk);
}
} else break;
}
return {
repetition: rep,
sequential: seq,
out: result
};
}
console.log(RepSeq(input, 3));
// Output:
// {
// out: ["123"],
// repetition: false,
// sequential: true
// }
使用这种方法,我们一次只查看一个块 ( i
+ n
) 的字符串。 例( n=3
):
1. [Dfd]f123125
2. D[fdf]123125
3. Df[df1]23125
4. Dfd[f12]3125
5. Dfdf[123]125 - Sequential!
6. Dfdf1[231]25
7. Dfdf12[312]5
8. Dfdf123[125]
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.