【发布时间】:2023-03-25 10:57:01
【问题描述】:
我想遍历一个数组,然后将每个值彼此相加(除了自身+自身),并且如果循环通过的两个值的总和等于我函数中的第二个参数,并且这对值之前没有遇到过,然后记住它们的索引,最后返回所有记住的索引的完整总和。
换句话说,问题陈述是:给定一个整数数组 A 和第二个值 s,它是所需的总和,从数组中找到所有值对A 在索引 i、j 上,使得 i 和 A[i] + A[ j] = s,并返回这些对的所有索引的总和,具有以下限制:
- 不要重复使用值对,即如果两个索引对 i、j 和 k、l满足上述条件,如果 A[i] == A[k] 和 A[j] == A[l] 或 A[i ] == A[l] 和 A[j] == A[k],然后忽略索引和较高的对。
示例
例如,functionName([1, 4, 2, 3, 0, 5], 7) 应该返回 11,因为值 4、2、3 和 5 可以相互配对以等于 7,而 11 来自将它们的索引相加得到 11 其中:
4 + 3 = 7
5 + 2 = 7
4 [index: 1]
2 [index: 2]
3 [index: 3]
5 [index: 5]
1 + 2 + 3 + 5 = 11
示例 #2
functionName([1, 3, 2, 4], 4) 只会等于 1,因为只有前两个元素可以配对等于 4,并且第一个元素的索引为 0,第二个元素的索引为 1
1 + 3 = 4
1 [index: 0]
3 [index: 1]
0 + 1 = 1
这是我目前所拥有的:
function functionName(arr, arg) {
var newArr = [];
for(var i = 0; i < arr.length; i++){
for(var j = i + 1; j < arr.length; j++) {
if((arr[i] + arr[j]) === arg ) {
newArr.push(i , j);
}
}
}
if(newArr.length === 0) {
return console.log(0);
}
return console.log(newArr.reduce(function(a,b){return a + b}));
}
functionName([1, 4, 2, 3, 0, 5], 7);
我遇到的问题是这一切都有效,但我有一个问题,一旦它找到一个等于第二个参数的对,那么它不应该再次使用相同的值对,但我的确实如此,例如:
如果数组是[1,1,1],第二个参数是2,循环将通过并找到答案,但它会在找到总和后继续搜索,我只希望它使用[1, 1]一次,所以如果它在索引[0, 1] 找到这样的一对,那么它不应该包含任何其他包含值1 的对。
我在想,如果使用过滤器找到超过 2 个相同的值,我可以删除其余相同的值,如果数组中有 2 个相同的值,我就不必担心循环两次找到 1 + 1,但这是最好的方法吗?
我还是新手,但期待你的 cmets
PS 我打算使用纯 JavaScript 而不是库来做这个
链接到一个 JS fiddle,这可能会让事情更容易看到我有什么。 https://jsfiddle.net/ToreanJoel/xmumv3qt/
【问题讨论】:
-
我对您遇到的问题有点困惑。在 [1,1,1] 示例中,函数是否应该返回 1,即 0 + 1,然后前 2 个 1 不再可用?如果是这样,您可以在推送到 newArr 后立即设置 arr[i] 和 arr[j] = null
-
是的,你有它,你可以看看我发送的小提琴,但我会测试你的观点,看看它是否有效
-
为了更好地处理它......如果使用
functionName([1, 2, 3, 1, 2, 3, 1], 4),你会期待什么 -
@Torean 澄清一下,
functionName([1, 1, 1], 2)的预期答案是什么? -
@Jaromanda X 我希望这样做如下: [1,2,3,1,2,3,1] 1 + 2 1 + 3 1 + 1 等然后寻找等于 4 的那些将是 [1,2,3,2]。不要以为在使用一对之后就不需要再次使用它并且循环不需要去。所以最终答案需要是 7 1 [index: 0] 2 [index: 1] 3 [index: 2] 2 [index: 4] 0+1+2+4 = 7 希望这会有所帮助
标签: javascript arrays algorithm