测试用例:
(6, [1,3,2,6,1,2]) returns (pairs / 2) = 5
它确实得到了答案,事情是做的比它需要做的更多,可以只添加一些验证来知道他何时添加相同的反向索引,但这只会让它做更多的事情。我正在寻找删除不需要的工作。还能更靠谱吗?
function returnOcurrences(k,ar){
debugger;
const letters = [new Set(ar)];
let pairs = 0;
for (let i = 0; i < ar.length; i++) {
for (let ii = 0; ii < ar.length; ii++) {
let a = ar[i] + ar[ii];
if (i != ii) {
if (a >= k) {
pairs += (a % k == 0) ? 1 : 0
}
}
}
}
return pairs/2;
}
最佳答案
我假设你想做的是阻止算法检查,例如ar[1] + ar[2]
,然后再次 ar[2] + ar[1]
。
要解决这个问题,请考虑从 i + 1
而不是从 0 开始您的内部循环。这可以防止上述情况发生,也可以防止算法将元素与自身相加(例如 ar[0] + ar[0]
)。因此,无需再检查 i
是否等于 ii
。
为什么会这样?假设外循环的第一次迭代。您正在使用 ar[1]
检查 ar[0] 的总和,然后使用 ar[2]
、ar[3]
,然后等等。
在外循环的第二次迭代中,您正在检查 ar[1]
与数组其他元素的总和。但是,您已经在上一次迭代中检查了 ar[0]
+ ar[1]
。因此,您从 ar[1]
+ ar[2]
开始,其中 ii = i + 1 = 2
。
所以代码变成:
function returnOcurrences(k,ar){
const letters = [new Set(ar)]; //I don't see the purpose of this variable but okay
var pairs = 0;
for (var i = 0; i < ar.length; i++) {
for (var ii = i + 1; ii < ar.length; ii++) {
var a = ar[i] + ar[ii];
if (a >= k) {
pairs += (a % k == 0) ? 1 : 0
}
}
}
return pairs/2;
}
希望这对您有所帮助!
关于javascript - 阅读二维数组行为问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57699485/