#javascript #arrays #algorithm
#javascript #массивы #алгоритм
Вопрос:
Как я могу написать функцию, которая находит наименьшее значение, которое не равно 1 и присутствует ровно в одном массиве?
Например:
const x = [1, 8, 7, 3, 4, 1, 8];
const y = [6, 4, 1, 8, 5, 1, 7];
должно возвращать 3, потому что это наименьшее число, которое есть только в одном массиве (x). если нет уникальных значений, то оно должно возвращать число больше 1 и меньше второго наименьшего числа. например
const x = [5, 5, 5, 7 ,7 ,7];
const y = [3, 4, 5, 1, 3, 7];
Приведенное выше значение должно возвращать 2, поскольку существует несколько вхождений 3, а наименьшее уникальное значение равно 1, поэтому число, которое должно быть возвращено, равно 2.
Я попробовал следующее.
function lowUniwueValue(x, y) {
const uniqueVal = parseInt(x.filter((obj) => y.indexOf(obj) == -1).toString());
return uniqueVal;
}
Приведенная выше функция возвращает уникальное значение, но я не могу гарантировать, что оно будет наименьшим.
Я также пытался создать новый набор, который имеет только уникальные значения, но тогда проблема в том, что мы не можем увидеть, есть ли дубликаты для меньшего числа.
Комментарии:
1. Что вы уже пробовали?
2. Подойдет ли вам код python?
3. @YashShah Это помечено JavaScript.
4. @Julia пожалуйста, посмотрите обновленный ответ
5. @hev1 Да, я знаю, но автору может быть достаточно такого подхода.
Ответ №1:
Вы можете найти частоту каждого числа, а также найти минимальное число, большее единицы (из обоих массивов). Если его частота равна ровно единице, это ответ; в противном случае ответ равен двум.
const getMin = (arr, arr2) => {
let freq = {},
min = Infinity;
[...arr, ...arr2].forEach(x => {
freq[x] = (freq[x] || 0) 1;
if (x > 1 amp;amp; x < min) min = x;
});
return freq[min] === 1 ? min : 2;
};
console.log(getMin([1, 8, 7, 3, 4, 1, 8], [6, 4, 1, 8, 5, 1, 7]));
console.log(getMin([5, 5, 5, 7, 7, 7], [3, 4, 5, 1, 3, 7]));
Ответ №2:
Используйте индексацию массива:
const x = [1, 8, 7, 3, 4, 1, 8];
const y = [6, 4, 1, 8, 5, 1, 7];
Шаг 1: Выполните итерацию по массиву x и отметьте этот элемент как посещенный, пометив индекс индексирующего массива равным 1.
Шаг 2: Выполните итерацию по массиву y и отметьте этот элемент как посещенный, пометив индекс индексирующего массива как 1, который имеет начальное значение 0, и 2, который имеет начальное значение 1.
Шаг 3: Индексирование массива становится arr = [0,2,0,1,2,1,1,2,2]
Ответом будет наименьшее значение, представляющее собой индекс, отмеченный 1 и не равный 1, т.е. 3.
Ответ №3:
Чао, безусловно, не сравнимо с элегантностью других ответов, но я пытался.
function findMin(x, y) {
let array = [Math.min(...x.filter(el => el !== 1)), Math.min(...y.filter(el => el !== 1))];
if (array[0] !== array[1]) {
let occx = x.reduce((a, v) => (v === array[0] ? a 1 : a), 0);
let occy = y.reduce((a, v) => (v === array[1] ? a 1 : a), 0);
if (occx === 1 amp;amp; occy === 1) return Math.min(...array);
else {
let min = Math.min(...array) - 1;
if (min !== 1) return min;
else {
// if min value -1 === 1 remove min elements found and continue to find
let indexa = x.indexOf(array[0]);
let indexb = y.indexOf(array[1]);
x.splice(indexa, 1);
y.splice(indexb, 1);
findMin(x, y);
}
}
}
else {
// if min values found are equal, remove them and continue to find
let indexa = x.indexOf(array[0]);
let indexb = y.indexOf(array[1]);
x.splice(indexa, 1);
y.splice(indexb, 1);
findMin(x, y);
}
}
console.log(findMin([1, 8, 7, 3, 4, 1, 8], [6, 4, 1, 8, 5, 1, 7]))
console.log(findMin([5, 5, 5, 7 ,7 ,7], [3, 4, 5, 1, 3, 7]))
Я нашел минимальное значение для обоих массивов, затем, если они отличаются, верните минимальное значение. В противном случае подсчитайте количество вхождений минимальных значений, найденных в обоих массивах, и в случае, если их более 1, уменьшите результат на 1 и, если он отличается от 1, верните его, в противном случае продолжайте поиск минимального значения (удаляя ранее найденные элементы).