Найти наименьшее значение, присутствующее ровно в одном массиве

#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, верните его, в противном случае продолжайте поиск минимального значения (удаляя ранее найденные элементы).