Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
数组javascript的两个元素组合_Javascript_Arrays_Algorithm_Data Structures_Ecmascript 6 - Fatal编程技术网

数组javascript的两个元素组合

数组javascript的两个元素组合,javascript,arrays,algorithm,data-structures,ecmascript-6,Javascript,Arrays,Algorithm,Data Structures,Ecmascript 6,例如,如果我有一个字母数组 ['A','C','D','E'] 我想找到这个数组的所有2个字母组合,不使用2 for循环的最好方法是什么。例如: for (var i=0; i<arr.length;i++) { for (var j=i+1; j<arr.length;j++) { console.log(arr[i] + " " + arr[j]); } } for(var i=0;i我认为您的代码有错误,因为这里永远不会使用E。 它应该是: var s = "

例如,如果我有一个字母数组

['A','C','D','E']

我想找到这个数组的所有2个字母组合,不使用2 for循环的最好方法是什么。例如:

for (var i=0; i<arr.length;i++) {
  for (var j=i+1; j<arr.length;j++) {
    console.log(arr[i] + " " + arr[j]);
  }
}

for(var i=0;i我认为您的代码有错误,因为这里永远不会使用E。
它应该是:

var s = "";
for (var i=0; i<arr.length-1;i++) {
  for (var j=i+1; j<arr.length;j++) {
    s += arr[i] + " " + arr[j]+" ; ";
  }
  s += "\n";
}
console.log(s);
var s=”“;

对于(var i=0;i我认为您的代码有一个错误,因为这里永远不会使用E。 它应该是:

var s = "";
for (var i=0; i<arr.length-1;i++) {
  for (var j=i+1; j<arr.length;j++) {
    s += arr[i] + " " + arr[j]+" ; ";
  }
  s += "\n";
}
console.log(s);
var s=”“;
对于(var i=0;i使用
.map()

像这样的

var arr=['A','C','D','E'],
组合=arr.map((v,i)=>arr.slice(i+1).map(v2=>v+v2));
console.log(组合);
使用
.map()

像这样的

var arr=['A','C','D','E'],
组合=arr.map((v,i)=>arr.slice(i+1).map(v2=>v+v2));

console.log(combinations);
我真的击败了这一个。正如所料,@Louis Durand对两个嵌套for循环的回答在包含100个字符串的数组中是最快的(在我的机器上大约是4毫秒)。这表明嵌套循环可能是这种情况下的最佳选择

第二快的是我的递归解决方案,它在大约7-8毫秒内完成了相同的操作

第三个是@Redu的答案,对于同一个任务,它的时间大约为12-15毫秒。我怀疑他的实现速度较慢,因为他在算法中使用了slice方法来更新数组(其他答案只是增加索引,而输入数组保持不变,这要快得多)。此实现还会导致输入数组的多个副本存储在内存中(每次调用函数时,它都会从原始数组中创建一个新的输入数组,并从中删除第一个元素)。这也可能会影响性能

所以回答你的问题:不,我不认为有更好的方法来处理你正在做的事情,除了连接到字符串并在最后打印答案(路易斯建议的)

var arr=[];
对于(变量i=0;i<100;i++){
arr.push(i+);
}
/*
控制台时间(“test0”);
test0();
函数test0(){
var s=“”;
对于(var i=0;i(e.push(c),e))
:[[c]],p),[]);
};
log(JSON.stringify(arr.combines(2));
}

控制台。时间结束(“测试2”)*/我真的把这个打倒在地。正如所料,@Louis Durand对两个嵌套for循环的回答在包含100个字符串的数组中是最快的(在我的机器上大约是4毫秒)。这表明嵌套循环可能是这种情况下的最佳选择

第二快的是我的递归解决方案,它在大约7-8毫秒内完成了相同的操作

第三个是@Redu的回答,对于同一个任务,回答时间大约为12-15毫秒。我怀疑他的实现较慢,因为他在算法中使用slice方法来更新数组(其他答案只是增加索引,而输入数组保持不变,这要快得多)。此实现还导致输入数组的多个副本存储在内存中(每次调用函数时,它都会从原始数组中创建一个新的输入数组,并从中删除第一个元素)。这也可能会影响性能

所以回答你的问题:不,我不认为有更好的方法来处理你正在做的事情,除了连接到字符串并在最后打印答案(路易斯建议的)

var arr=[];
对于(变量i=0;i<100;i++){
arr.push(i+);
}
/*
控制台时间(“test0”);
test0();
函数test0(){
var s=“”;
对于(var i=0;i(e.push(c),e))
:[[c]],p),[]);
};
log(JSON.stringify(arr.combines(2));
}

控制台。时间结束(“测试2”)*/不仅是两个,而且对于任意数量的元素,您可以执行以下操作:

Array.prototype.combines=函数(n){
返回这个.reduce((p,c,i,a)=>p.concat(n>1?a.slice(i+1).组合(n-1).映射(e=>[].concat(e,c))
:[[c]],[]);
};
log(JSON.stringify([1,2,3,4,5,6]。组合(2));

log(JSON.stringify([1,2,3,4,5,6].compositions(3))不仅是两个,而且对于任意数量的元素,您可以执行以下操作:

Array.prototype.combines=函数(n){
返回这个.reduce((p,c,i,a)=>p.concat(n>1?a.slice(i+1).组合(n-1).映射(e=>[].concat(e,c))
:[[c]],[]);
};
log(JSON.stringify([1,2,3,4,5,6]。组合(2));

log(JSON.stringify([1,2,3,4,5,6].compositions(3))这将是数组中的排列,有几个答案显示了如何做到这一点,但您必须迭代,可能不止一次。n choose k有一种通用形式的算法,但在时间复杂度方面并不比您的代码更有效。1000 choose 2始终等于相同的数字,因此在这方面没有可以进行的优化。也许你应该重新考虑是否需要每种组合来解决你的问题?我问这个问题的主要原因也是因为在Hackerrank上,我的算法通常通过前几个测试,但是当数字太大或数组太大时。。。javascript超时。即使是一个非常简单的算法…给我们看看问题!简单并不意味着数组中的排列更快,有几个答案说明了如何做到这一点,但你必须迭代,可能不止一次。n choose k有一个通用的算法形式,但就时间复杂度而言,它并不比你的代码更有效。1000 choose 2始终等于相同的数字,因此在这方面没有可以进行的优化。如果你需要各种组合来解决你的问题,也许你应该重新考虑一下