javascript - 阅读二维数组行为问题?

标签 javascript arrays sorting

测试用例:

(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/

相关文章:

javascript - Vue.js 无法在 :style (twig template) 中设置背景图像

javascript - 如何从字符串中调用匿名函数

javascript - 确定更大的数字并划分

c# - 将数组转换为简单字符串的 C# 方法/语法是什么?

java - 当java中的字符串具有双字节字符时,如何对字符串进行子串

php - 使用 PHP 的 uasort 进行排序时保留键顺序(稳定排序)

javascript - 难以理解 JavaScript 编码

arrays - 我如何确保用户不能重复输入?

java - 仅根据字段名称对类数组进行排序

c++ - 分而治之算法找到最大元素的位置