我有要重构的代码。我是 javascript 新手,所以我想使用下划线等库中的函数来制作更具可读性的代码。 下面的函数可以检测字符串 包含 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 来完成,但我试图在没有它的情况下完成它。
答案 0 :(得分:0)
我没有使用内部的 for
循环,而是使用 Array.prototype.slice() 将字符串分块为 n
以查看前面的 n
字符。我使用 Array.prototype.indexOf() 根据 abc
和 num
常量(ref)查找它是否是连续的。为了查看它是否重复,我使用了 Array.prototype.every() 循环遍历块并检查它们是否相似并根据表达式返回一个布尔值。
结果给出了找到的每个实例的输出,以及它是连续的还是重复的。
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]