【发布时间】:2019-07-17 20:40:42
【问题描述】:
只是为了详细说明所提出的问题。假设您有一个从 0 到 n (0,1,2, ... n-1,n) 的序列。我想返回一个数组,其中包含满足相邻数字的差必须大于 1 的条件的所有可能排列。例如,给定序列 (0,1,2,3),唯一有效的排列是 ( 1,3,0,2) 和 (2,0,3,1)。
其实我已经有了一个工作函数。
function validSequences(n) {
let all = [],
baseSequence = [],
startingValue = 0,
sequenceLastIndex = 0;
for (let x=0; x<n; x++) {
baseSequence.push(x);
}
while (startingValue < n) {
while (sequenceLastIndex < (n-1)) {
if (sequenceLastIndex == 0) {
let nextPossibleValues = baseSequence.filter((i) => {
return Math.abs(startingValue - i) > 1;
});
nextPossibleValues.forEach((value) => {
all.push([startingValue, value]);
});
} else {
all.forEach((sequence) => {
if (sequence[0] == startingValue) {
let nextPossibleValues = baseSequence.filter((i) => {
return Math.abs(sequence[sequenceLastIndex] - i) > 1 && !sequence.includes(i);
});
if (nextPossibleValues.length == 0) {
all = all.filter((keep) => {
return keep !== sequence;
});
} else {
nextPossibleValues.forEach((value) => {
let copy = [...sequence];
copy.push(value);
all.push(copy);
});
}
all = all.filter((keep) => {
return keep[0] !== startingValue || keep.length == (sequenceLastIndex + 2);
});
}
});
}
sequenceLastIndex++;
}
sequenceLastIndex = 0;
startingValue++;
}
return all;
}
上述函数将产生最多 0-7 的序列的瞬时结果。任何高于此的时间都将花费大量时间。谁能想出一个可以处理更长序列的解决方案,或者比我目前拥有的更高效/优雅的解决方案?
【问题讨论】:
-
在
all的循环期间修改all是一个非常糟糕的主意。 -
生成的排列顺序重要吗?
-
既然你提到了它,我肯定明白为什么在循环遍历数组时更改数组是一个坏主意,而且顺序无关紧要。