如何查找数组中的对数

时间:2019-05-31 13:19:31

标签: javascript arrays algorithm

我想找到一个数组中的对数。我写了这段代码,但并非在所有情况下都有效

function getPair(n, arr) {
    let paire = 0;
    let arr1 = arr.slice().sort();
    let arrBack = new Array();

    if (n == arr.length) {
        console.log("il y a " + n + " chaussettes dans le tableau");
        for (let i = 0; i < arr1.length; i+=2) {
            if (arr1[i] == arr1[i+1]) {
                    arrBack.push(arr1[i]);
                }
            }
            paire += arrBack.length;
        }
    return paire;
}

let n = 9;
let arr = [10, 20, 20, 10, 10, 30, 50, 10, 20]; // 4

console.log(getPair(n, arr));

4 个答案:

答案 0 :(得分:0)

您可以使用哈希表

 pair= {},
    res;

arr.reduce((x, y) => {
    var k = [x, y].join('|');
    pair[k] = (pair[k] || 0) + 1;
    return y;
});

   res = Object.values(pair);
   console.log(pair);
   console.log(res);

答案 1 :(得分:0)

首先在数组let arr = [10, 20, 20, 10, 10, 30, 50, 10, 20];中,我仅看到3对:[10, 10][20, 20][10, 10]

然后回答这个问题,我会做这样的事情:

function getPair(arr) {
    console.log("il y a " + arr.length + " chaussettes dans le tableau");
    
    let tempArr = new Array();
    arr.map(n => tempArr[n] = tempArr[n]!=undefined? tempArr[n]+1:1 );
    return tempArr.reduce((accumulator, currentValue) => accumulator + Math.floor(currentValue/2), 0);
}

let arr = [10, 20, 20, 10, 10, 30, 50, 10, 20];

console.log(getPair(arr));

答案 2 :(得分:0)

function getPairs(n,arr){
    var paired_arr = [];
    var temp_arr = [];
    var temp;
    arr.sort();
    for(var i=0;i<arr.length;i++){
        temp = arr[i];
        if(i == 0 || arr[i-1] == temp){
            temp_arr.push(temp);
        }
        else if(arr[i-1] != temp){
            paired_arr.push(temp_arr);
            temp_arr = [];
            temp_arr.push(temp);
        }
    }
    paired_arr.push(temp_arr);
    var pairs = 0;
    for(var i in paired_arr){
        if(paired_arr[i].length > 1){
            if(paired_arr[i].length%2 == 0){
                pairs+=(paired_arr[i].length/2);
            }
            else{
                pairs+=((paired_arr[i].length-1)/2);
            }
        }
    } 
    console.log("il y a " + n + " chaussettes dans le tableau");
    return pairs;
}
var arr = [10, 20, 20, 10, 10, 30, 50, 10, 20];
console.log(getPairs(9,arr));

答案 3 :(得分:0)

这是一个班轮...

let pairCount = [...arr.reduce((map, val) => map.set(val,(map.get(val) || 0) + 0.5), new Map()).values()].reduce((total, count) => total += Math.floor(count), 0)

...如果arr = [10,20,20,10,10,30,50,10,20],则执行以下操作:

arr.reduce((map,val)=> map.set(val,(map.get(val)|| 0)+ 0.5),新的Map())遍历数组,计算一个值的出现次数,并将其放置在Map中。这部分产生具有4个条目的Map,即{10 => 2、20 => 1.5、30 => 0.5、50 => 0.5}。请注意,对于找到的每个值,我只加0.5,以便整数代表对数。即10 => 2是两对10。

然后 .values()将其转换为MapIterator,仅保留{2,1.5,0.5,0.5}的值。

然后,周围的 [... ] 将MapIterator值转换为数组,即[2,1.5,0.5,0.5]。

现在,我进一步通过 .reduce((total,count)=> total + = Math.floor(count),0)来简化此数组,该运算简单地将对总数取整,四舍五入当然每个下来都是成对的。结果为 pairCount 等于 3

顺便说一句,请注意,我并没有全心全意。宝贵的Chrome调试器与大量的Google搜索结合使用Array和Map函数的“工具箱”,使我能够反复尝试解决方案。