gpt4 book ai didi

javascript - 排列Javascript

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:31:14 25 4
gpt4 key购买 nike

现在我有了这个代码,在输入中我的名字字母“ahimrsu”按升序排列。我需要从所有应该为 2170 的组合中显示“mariush”的正确数字。现在它只显示 ahimrsu、ahimrus、ahimsru、ahimsur、ahimurs、ahimusr、ahirmus、ahirmsu ....等等 我该怎么做这个?

<!DOCTYPE HTML>

<html>
<head>
<!--Script Function Start Here-->
<script type="text/javascript">
function perms(data) {
if (!(data instanceof Array)) {
throw new TypeError("input data must be an Array");
}

data = data.slice(); // make a copy
var permutations = [],
stack = [];

function doPerm() {
if (data.length == 0) {
permutations.push(stack.slice());
}
for (var i = 0; i < data.length; i++) {
var x = data.splice(i, 1);
stack.push(x);
doPerm();
stack.pop();
data.splice(i, 0, x);
}
}

doPerm();
return permutations;
}

var input = "ahimrsu".split('');
var result = perms(input);
for (var i = 0; i < result.length; i++) {
result[i] = result[i].join('');
}
console.log(result);
</script>
<!--Header start here-->
</head>
<body>
<!--Script Result-->
<script type="text/javascript">
document.write(result);
</script>

</body>
</html>

最佳答案

这是我根据以下答案得出的解决方案:https://stackoverflow.com/a/18879232/783743

var permute = (function () {
return permute;

function permute(list) {
return list.length ?
list.reduce(permutate, []) :
[[]];
}

function permutate(permutations, item, index, list) {
return permutations.concat(permute(
list.slice(0, index).concat(
list.slice(index + 1)))
.map(concat, [item]));
}

function concat(list) {
return this.concat(list);
}
}());

您可以使用permute 函数来查找数组的所有排列:

var array = "ahimrsu".split("");
var permutations = permute(array).map(join);
var index = permutations.indexOf("maruish");

function join(array) {
return array.join("");
}

算法非常简单易懂:

  1. 我们想要一个 [a] -> [[a]] 类型的函数 permute (即给定一个 a 列表它返回输入排列的列表)。
  2. 给定一个空列表 ([]) 作为输入,输出是一个空的排列列表 ([[]])。
  3. 否则对于每个元素:
    1. 我们从列表中删除该元素。
    2. 我们递归地找到剩余元素的排列。
    3. 我们将删除的元素添加到每个排列的开头。

例如,假设我们要找到数组[1, 2, 3]的排列:

1. permute([1, 2, 3]) === [1, 2, 3].reduce(permutate, [])
1. permutate([], 1, 0, [1, 2, 3])
1. permute([2, 3]) === [2, 3].reduce(permutate, [])
1. permutate([], 2, 0, [2, 3])
1. permute([3]) === [3].reduce(permutate, [])
1. permutate([], 3, 0, [3])
1. permute([]) === [[]]
2. [[]].map(concat, [3]) === [[3]]
3. [].concat([[3]]) === [[3]]
2. [[3]].map(concat, [2]) === [[2, 3]]
3. [].concat([[2, 3]]) === [[2, 3]]
2. permutate([[2, 3]], 3, 1, [2, 3])
1. permute([2]) === [2].reduce(permutate, [])
1. permutate([], 2, 0, [2])
1. permute([]) === [[]]
2. [[]].map(concat, [2]) === [[2]]
3. [].concat([[2]]) === [[2]]
2. [[2]].map(concat, [3]) === [[3, 2]]
3. [[2, 3]].concat([[3, 2]]) === [[2, 3], [3, 2]]
2. [[2, 3], [3, 2]].map(concat, [1]) === [[1, 2, 3], [1, 3, 2]]
3. [].concat([[1, 2, 3], [1, 3, 2]]) === [[1, 2, 3], [1, 3, 2]]
2. permutate([[1, 2, 3], [1, 3, 2]], 2, 1, [1, 2, 3])
1. permute([1, 3]) === [1, 3].reduce(permutate, [])
2. [[1, 3], [3, 1]].map(concat, [2]) === [[2, 1, 3], [2, 3, 1]]
3. [[1, 2, 3], [1, 3, 2]].concat([[2, 1, 3], [2, 3, 1]])
3. permutate([[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]], 3, 2, [1, 2, 3])
1. permute([1, 2]) === [1, 2].reduce(permutate, [])
2. [[1, 2], [2, 1]].map(concat, [3]) === [[3, 1, 2], [3, 2, 1]]
3. [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]].concat([[3, 1, 2], [3, 2, 1]])

旧的解释:

  1. 首先我们删除列表的第一个元素。因此我们有项目 1 和列表 [2, 3]
    1. 接下来我们找到[2, 3]的排列。
      1. 我们删除第一个元素。因此我们有项目 2 和列表 [3]
        1. 接下来我们找到[3]的排列。
          1. 我们删除第一个元素。因此我们有项目 3 和列表 []
            1. 接下来我们找到 [] 的排列,即 [[]]
          2. 我们将 3 添加到每个排列的开头。
          3. 结果是[[3]]
        2. 我们将 2 添加到每个排列的开头。
        3. 结果是[[2, 3]]
      2. 我们删除第二个元素。因此我们有项目 3 和列表 [[2]]
        1. 接下来我们找到[2]的排列。
          1. 我们删除第一个元素。因此我们有项目 2 和列表 []
            1. 接下来我们找到 [] 的排列,即 [[]]
          2. 我们将 2 添加到每个排列的开头。
          3. 结果是[[2]]
        2. 我们将 3 添加到每个排列的开头。
        3. 结果是[[3, 2]]
      3. 我们合并这两个列表。
      4. 结果是 [[2, 3], [3, 2]]
    2. 我们将 1 添加到每个排列的开头。
    3. 结果是 [[1, 2, 3], [1, 3, 2]]
  2. 第二个元素相同:项目 2 和列表 [1, 3]
  3. 第三个元素相同:项目 3 和列表 [1, 2]
  4. 我们合并三个列表。
  5. 结果是[[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]].

查看演示:

var permute = (function () {
return permute;

function permute(list) {
return list.length ?
list.reduce(permutate, []) :
[[]];
}

function permutate(permutations, item, index, list) {
return permutations.concat(permute(
list.slice(0, index).concat(
list.slice(index + 1)))
.map(concat, [item]));
}

function concat(list) {
return this.concat(list);
}
}());

var array = "ahimrsu".split("");
var permutations = permute(array).map(join);
var index = permutations.indexOf("maruish");

alert("maruish is the " + (index + 1) + "th permutation of ahimrsu.");

function join(array) {
return array.join("");
}

希望对您有所帮助。

关于javascript - 排列Javascript,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26506429/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com