好的,这是一个关于创建排列的问题,可以是一个通用的问题,而不是针对JavaScript或特定句子的问题,有多种方法,让我简短地解释其中之一:
所以,你的句子"I am the man"有四个单词,首先将它们拆分成一个数组,例如
var words = "I am the man".split(" ")
所以你的数组有单词
["I", "am", "the", "man"]
,并且
length
是
4
,因为你有4个单词。
现在,如果要生成这些数字(
1234
)的排列,并使用每个结果的每个数字作为单词数组的索引并连接呢?感到困惑吗?让我解释一下。
假如我们可以生成一个像这样的数组
[1, 2, 3, 4, 12, 13, 14, 21, 23, 24, 41, 42, 43, 123, 124, ...., 4321]
然后从每个数字中构建一个句子:
例如:
1: "I"
4: "man"
43: "man the"
..
..
4321: "man the am I"
如果你对如何从数字生成这些字符串有疑问,我稍后会解释,现在不要忘记你已经有了单词数组。
现在,问题可能会出现,如果我们计算超过9个条目的排列呢?对于9,最大值将为987654321(因为我们将所有内容都视为数字),因此在所有情况下,我更喜欢构建一个数组而不是数字,因为最终我们需要拆分所有数字并从单词数组中获取索引,
所以,我更喜欢
[ [1],[2],[3],[4],[1,2],[1,3],...,[3,4,1],.........,[4,3,2,1] ]
而不是
[1,2,3,4,12,13,14,21,23,24,41,42,43,123,124,....,4321]
因为数字可能超过9,我们可以轻松处理它。
那么,现在的问题是如何构建数字数组(相信我,这是要做的最重要的事情,你的输出只是它的逻辑映射)
所以,如果我们通过像这样初始化一个数组来开始:[[1],[2],[3],[4]]
,直到长度为止,所以我们将从第2级开始,
我们将循环,从1到Length(即从1到4),并在每次迭代中迭代到每个数组,并检查该数组是否包含当前数字,如果没有,我们将切片该数组,并将当前数字推到开头,然后将其推回主结果数组。 我们还将传递每个数字数组,以便我们不需要查看整个数组,对于级别1,两者将是相同的,因此我们将通过slice()
复制它,并且我们也将返回当前数字的数组。
function processEachDigit(length, mainArray, lastDigitArray) {
var currDigitArray = [];
var n;
for (n = 1; n <= length; n++) {
for (idx = 0; idx < lastDigitArray.length; idx++) {
var eachArray = lastDigitArray[idx];
if (!eachArray.includes(n)) {
var newArr = eachArray.slice();
newArr.unshift(n)
mainArray.push(newArr);
currDigitArray.push(newArr)
}
}
}
return currDigitArray;
}
首次出现的是:
mainArray = [[1], [2], [3], [4]] //将通过循环进行初始化
以及
currDigitArray = mainArray.slice()
//as we will keep update mainArray we cannot use the same reference
"我们将像这样调用它:"
processEachDigit(words.length, mainArray, currDigitArray)
所以主数组是
[[1], [2], [3], [4]]
然后变成了
[[1], [2], [3], [4], [1, 2], [1,3], ......., [4,2], [4,3]]
并且返回第二个数字元素的数组,即
[[1,2], [1, 3], [1, 4], [2, 1], [2, 3]......., [4,2], [4,3]]
因此,我们将使用第二位数字数组来构建第三位数字数组,然后将第三位数字数组传递给构建第四位数字数组。
现在,我们真的需要最初构建单个数字数组吗?不需要。
传递一个空的数组将其创建为找不到任何元素,因此我们只需要将主数组初始化为空数组,当前数字数组初始化为空数组的数组,我只是用slice()
等来解释我们正在尝试做什么。
我们开始吧
function getPermutationArray(L) {
var mainArr = [];
var n;
var currDigitArr = [[]];
for(n=1;n<=L;n++) {
currDigitArr = processEachDigit(L, mainArr, currDigitArr);
}
return mainArr;
}
现在您可以调用
getPermutationArray(<任何数字>)
并返回该数组,现在尝试从该数组进行映射。如果失败,我会帮助您,这是一项简单的工作。
注意:我本可以写一个小代码段,但只是为了更好地解释它而写了这么多内容,而且可能有很多方法,我只尝试了其中之一,因为我不想使用递归,使用递归也可以实现此目标。如果有什么不清楚的地方,请留言。
祝编码愉快 :)