Codewars javascript任务-帮助理解
我正在接受一项调查: 给定一个整数列表和一个求和值,返回前两个 值(请从左边解析)按相加的外观顺序排列 形成总和。 例如: 你认为整对“更早”是什么意思?如果它的索引之和最小,则IMO。现在基于此假设,我制定了解决方案,但有一次测试失败:Codewars javascript任务-帮助理解,javascript,Javascript,我正在接受一项调查: 给定一个整数列表和一个求和值,返回前两个 值(请从左边解析)按相加的外观顺序排列 形成总和。 例如: 你认为整对“更早”是什么意思?如果它的索引之和最小,则IMO。现在基于此假设,我制定了解决方案,但有一次测试失败: var sum\u pairs=函数(ints,s){ 设i=0; 设pair=[0,0]; 设ind=[100100] 让发现=错误; 函数循环(一){ if(i>ints.length)返回对; 整数切片(i).forEach((当前,idx)=>{ 整
var sum\u pairs=函数(ints,s){
设i=0;
设pair=[0,0];
设ind=[100100]
让发现=错误;
函数循环(一){
if(i>ints.length)返回对;
整数切片(i).forEach((当前,idx)=>{
整数切片(i+1).some((num,i)=>{
设sum=curr+num;
设prevIndicies=ind[0]+ind[1];
如果(总和===s&&prevIndicies>idx+i){
ind=[idx,i];
pair=[curr,num];
发现=真;
返回true;
}
})
})
i+=1;
环路(一)
}
循环(0)
如果(找到){
返回对
}
返回未定义;
}
log(sum_pairs([1,4,8,7,3,15],8))
这意味着从左到右取第一个匹配对,因为7是创建对(从左)的第一个元素,所以3和7是第一对
我会更容易地解决它:
function sum_pairs(arr, target) {
let old = [];
let result = [];
arr.some((el) => {
let found = old.find((oldEl) => oldEl + el === target);
if (found) return result = [found, el];
old.push(el);
})
return result;
}
sum_pairs([10, 5, 2, 3, 7, 5], 10);
编辑:解释。我在数组中的所有元素上循环,搜索匹配项,然后返回我传递的所有元素。如果我找到一个匹配项,我会记住它并通过返回一个“truthy”值来打破循环。(这就是.some()的工作原理。)最后,如果我没有找到匹配的元素,我会将该元素添加到我的旧元素列表中,然后继续下一个元素。这意味着从左到右取第一对匹配的元素,因为7是创建一对(从左开始)的第一个元素,3和7是第一对 我会更容易地解决它:
function sum_pairs(arr, target) {
let old = [];
let result = [];
arr.some((el) => {
let found = old.find((oldEl) => oldEl + el === target);
if (found) return result = [found, el];
old.push(el);
})
return result;
}
sum_pairs([10, 5, 2, 3, 7, 5], 10);
编辑:解释。我在数组中的所有元素上循环,搜索匹配项,然后返回我传递的所有元素。如果我找到一个匹配项,我会记住它并通过返回一个“truthy”值来打破循环。(这就是.some()的工作原理。)最后,如果没有找到匹配项,我会将该元素添加到旧元素列表中,然后继续下一个元素。我很确定这意味着他们希望第二个元素在列表中尽可能向左。比如说,
l5= [10, 5, 2, 3, 7, 5];
当试图找到10的和时,所需的输出为
[3, 7]
[10, 5, 2, 3, 7, 5];
^ ^
而不是
[5, 5]
[10, 5, 2, 3, 7, 5];
^ ^
因为[3,7]
中的最后一个元素7位于第二个5之前
此代码似乎通过了所有测试用例-以三角形方式迭代,从标记开始[0,1]
,[0,2]
,[1,2]
,[0,3]
,[1,3]
,[2,3]
,…:
const sum_pairs = function(ints, s){
const { length } = ints;
for (let i = 1; i < length; i++) {
for (let j = 0; j < i; j++) {
if (ints[i] + ints[j] === s) return [ints[j], ints[i]];
}
}
}
const sum\u pairs=函数(ints,s){
常量{length}=ints;
for(设i=1;i
const sum\u pairs=函数(ints,s){
常量{length}=ints;
for(设i=1;i log(sum_pairs(l8,10))
我很确定这意味着他们希望列表中的第二个元素尽可能向左。比如说,
l5= [10, 5, 2, 3, 7, 5];
当试图找到10的和时,所需的输出为
[3, 7]
[10, 5, 2, 3, 7, 5];
^ ^
而不是
[5, 5]
[10, 5, 2, 3, 7, 5];
^ ^
因为[3,7]
中的最后一个元素7位于第二个5之前
此代码似乎通过了所有测试用例-以三角形方式迭代,从标记开始[0,1]
,[0,2]
,[1,2]
,[0,3]
,[1,3]
,[2,3]
,…:
const sum_pairs = function(ints, s){
const { length } = ints;
for (let i = 1; i < length; i++) {
for (let j = 0; j < i; j++) {
if (ints[i] + ints[j] === s) return [ints[j], ints[i]];
}
}
}
const sum\u pairs=函数(ints,s){
常量{length}=ints;
for(设i=1;i
const sum\u pairs=函数(ints,s){
常量{length}=ints;
for(设i=1;i log(sum_pairs(l8,10))
这是一个非常糟糕的问题。你能给我一个提示吗?对我来说似乎很好,因为如果找到结果,一些会停止循环数组,尽管forEach仍然可以继续,所以这里可能是一个需要改进的地方我知道它看起来很丑。这就是我所能想到的…对不起,我不是指你的问题,这很好,我是说codewars问题措辞很糟糕(你必须在这里发帖才能弄清楚这一点就证明了-是的,不清楚他们的意思)我读到的是“整对都是更早的”这句话指的是3,和7都是在数组中首先遇到的,早于按照说明从左边解析数组时遇到的两个5。我同意@PaulCurtis的观点,答案是在数组中遇到的第一对