Здесь у меня есть массив из 5 чисел, из которых 3 (или более) одинаковы: [1,1,4,2,1].
Как я могу получить только два других числа из массива (в данном примере [4,2])?
Вот несколько тестовых примеров:
[1,1,4,2,1] => [4,2] or [2,4]
[5,5,1,5,5] => [1,5] or [5,1]
[3,4,3,4,3] => [4,4]
[6,6,6,6,6] => [6,6]
Я сам кое-что попробовал, решил посчитать цифры. Я добился некоторого прогресса, но не знаю, куда двигаться дальше.
function getUniques(arr) {
const counts = {};
arr.forEach(num => {counts[num] = (counts[num]||0) + 1});
const uniques = [];
Object.keys(counts).forEach(n => {
if (counts[n] === 1)
uniques.push(Number(n));
});
return uniques;
}
console.info(getUniques([1,4,2,1,1])) // [2,4]
console.info(getUniques([6,3,3,6,6])) // []
console.info(getUniques([5,3,5,5,5])) // [3]
console.info(getUniques([4,4,4,4,4])) // []Должен ли сохраняться какой-то порядок, может ли решение для второго также быть [5,1]?
В случае [1,1,4,2,1] → [4,2] вы удалили первые три дубликата. В [1,5,1,1,1] → [1,5] вы удалили последние три дубликата.
@ParzhfromUkraine Нет, в первом случае были удалены три последних дубликата.
Подсчитайте количество вхождений по модулю 3 в объекте или карте и создайте массив результатов с новыми значениями.
@jabaa Ах, окей, согласен
вау, сообщество stack overflow такое милое и полезное 😊 оно дает мне повод жить
Готовы помочь. Можете ли вы прояснить те моменты, которые были подняты выше? Поможет ли вам вклад Джабаа решить проблему?
да, выходные данные могут иметь два числа в любом порядке. и это должно быть два числа.
Ах, я вижу требование, чтобы входные данные всегда имели размер 5.
@trincot, меня это не беспокоит - я знаю, что во входных данных будет как минимум 3 одинаковых числа
Хорошо, я проголосовал за возобновление вопроса — да, важно немедленно реагировать на комментарии, которые вы получаете после публикации ,-)
Снова открыл вопрос. На самом деле это первый вопрос, который, как я видел, был открыт повторно.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете перебирать массив, чтобы поддерживать счетчик для каждого уникального значения. Для этой цели вы можете использовать Map или простой предмет. Но вместо обычного счетчика сделайте это по модулю 3:
function removedTriplets(arr) {
const counter = {};
for (const value of arr) counter[value] = ((counter[value] || 0) + 1) % 3;
return arr.filter(value => counter[value]-- > 0);
}
const tests = [
[1,1,4,2,1],
[1,5,1,1,1],
[3,3,3,3,3],
[8,9,8,9,8],
];
for (const arr of tests) {
console.info(JSON.stringify(arr), "=>", JSON.stringify(removedTriplets(arr)));
}это гениально, спасибо
Вы можете подсчитать вхождения, найти, какие числа встречаются три или более раз, и удалить их:
function removeThreeDuplicates(inputs) {
const inputCopy = inputs.slice()
const occurrences = Object.create(null)
for (const [index, input] of inputCopy.entries()) {
occurrences[input] ??= []
occurrences[input].push(index)
}
for (const indexes of Object.values(occurrences)) {
if (indexes.length >= 3) {
const indexesToDelete = indexes.slice(0, 3)
for (const index of indexesToDelete.reverse()) {
inputCopy.splice(index, 1)
}
return inputCopy
}
}
throw new Error('Unexpected input, expected an array of five numbers and three duplicates')
}
console.info(removeThreeDuplicates([1, 1, 4, 2, 1])) // => [4, 2]
console.info(removeThreeDuplicates([5, 5, 1, 5, 5])) // => [1, 5]
console.info(removeThreeDuplicates([3, 4, 3, 4, 3])) // => [4, 4]
console.info(removeThreeDuplicates([6, 6, 6, 6, 6])) // => [6, 6]
разве ваш результат из третьего примера не должен быть просто
[3]? трудно понять, чего именно вы хотите, а также ваша попытка отсутствует