Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Найти количество одинаковых пар в массиве (https://javascript.ru/forum/misc/84144-najjti-kolichestvo-odinakovykh-par-v-massive.html)

NovichokJS 15.06.2022 10:25

Найти количество одинаковых пар в массиве
 
Помогите пожалуйста поправить в коде так, чтобы всё отработало. Вот мой код:

function numberOfPairs(gloves) {

    let count = 0;
    for (let i = 0; i < gloves.length; i++) {
        for (let j = 0; j < i; j++) {
            if ((gloves[i] == gloves[j])) {

                count++;
            }

        }
    }
    return count;
}

console.log(numberOfPairs(["red", "green", "red", "blue", "blue"])); // 2
console.log(numberOfPairs(["gray", "green", "red", "blue", "yellow"])); // 0
console.log(numberOfPairs(["gray", "green", "red", "green", "yellow"])); // 1
console.log(numberOfPairs(["red", "red", "yellow"])); // 1
console.log(numberOfPairs(["red", "red", "red", "red", "red", "red"])); // 3


Если все элементы одинаковы, то у меня выводит число 15 в последнем вызове тут console.log(numberOfPairs(["red", "red", "red", "red", "red", "red"])); - должно быть 3.

рони 15.06.2022 10:37

NovichokJS,
что такое пара?

рони 15.06.2022 10:46

NovichokJS,
function numberOfPairs(gloves) {
    const obj = {};
    let count = 0;
    for (let el of gloves) {
       obj[el] = (obj[el]||0)+1;
       obj[el] %= 2;
       obj[el] || count++;
    }
    return count;
}

console.log(numberOfPairs(["red", "green", "red", "blue", "blue"])); // 2
console.log(numberOfPairs(["gray", "green", "red", "blue", "yellow"])); // 0
console.log(numberOfPairs(["gray", "green", "red", "green", "yellow"])); // 1
console.log(numberOfPairs(["red", "red", "yellow"])); // 1
console.log(numberOfPairs(["red", "red", "red", "red", "red", "red"])); // 3

NovichokJS 15.06.2022 10:47

Цитата:

Сообщение от рони (Сообщение 546144)
NovichokJS,
что такое пара?

это пара одинаковых цветов в массиве - считается если 2 значчения равны в массиве, тогда к count прибавляем 1. В случае console.log(numberOfPairs(["red", "red", "red", "red", "red", "red"])); // 3
у нас 3 одинаковых пары, поэтому должно вернуть количество равное 3.

Vlasenko Fedor 15.06.2022 10:54

function numberOfPairs(gloves) {
    let tmp = {};
    for (let item of gloves) tmp[item] = ++tmp[item] || 1;
    return Object.values(tmp).reduce((a, v) => a + Math.floor(v / 2), 0);
}

:dance:

NovichokJS 15.06.2022 11:26

Цитата:

Сообщение от Vlasenko Fedor (Сообщение 546151)
function numberOfPairs(gloves) {
    let tmp = {};
    for (let item of gloves) tmp[item] = ++tmp[item] || 1;
    return Object.values(tmp).reduce((a, v) => a + Math.floor(v / 2), 0);
}

:dance:

круто, можете объяснить подробно что тут происходит tmp[item] = ++tmp[item] || 1;

рони 15.06.2022 11:28

Цитата:

Сообщение от NovichokJS
строки 5, 6 ,7

obj[el] = (obj[el]||0)+1;

если название(el) встретилось добавляем единицу в счётчик названия(obj[el])
obj[el] %= 2;
obj[el] || count++;


если счётчик названия делится на два, увеличиваем общий счётчик.
почти тоже что
if(obj[el] %= 2 == 0) count++;

рони 15.06.2022 11:29

Цитата:

Сообщение от рони
obj[el] = (obj[el]||0)+1;

тоже самое
Цитата:

Сообщение от NovichokJS
tmp[item] = ++tmp[item] || 1;


NovichokJS 15.06.2022 12:09

Цитата:

Сообщение от рони (Сообщение 546154)
obj[el] = (obj[el]||0)+1;

если название(el) встретилось добавляем единицу в счётчик названия(obj[el])
obj[el] %= 2;
obj[el] || count++;


если счётчик названия делится на два, увеличиваем общий счётчик.
почти тоже что
if(obj[el] %= 2 == 0) count++;

ок, но единственное еще это пока полностью не могу понять obj[el] = (obj[el]||0)+1;
Можно как-то по-другому это написать? возможно с if

NovichokJS 15.06.2022 12:23

я кажется понял. Эта фраза obj[el] = (obj[el]||0)+1; тоже саме что и эта:
if (obj[el] !== undefined) { obj[el] += 1 } else { obj[el] = 1 }


Часовой пояс GMT +3, время: 15:00.