Как я могу выбрать уникальный элемент в массиве? - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь решить эту задачу поиска уникального элемента внутри массива. До сих пор мне удалось решить 95%, но я терплю неудачу на 0. Я получаю ошибку, говорящую, что ожидал 0 и получил 1.

Я должен получить // 10, что он делает, но после того, как я 'м проваливаю тест онлайн. Для всех остальных значений оно прошло.

Есть идеи о том, как решить эту проблему и что мне здесь не хватает?

function findOne(arr) {
  let x = arr[0];
  for (let i of arr) {
    if (i === x) {
      continue;
    } else {
      x = i;
    }
    return x;
  }
}
console.log(findOne([3, 10, 3, 3, 3]));

Ответы [ 5 ]

0 голосов
/ 30 октября 2019

это намного проще и быстрее:

function findOne(arr) {
  const a = arr.reduce((acc, e) => {
    e in acc || (acc[e] = 0)
    acc[e]++
    return acc
  }, {})
  return Object.keys(a).filter(k => a[k] === 1)[0] || null
}
0 голосов
/ 29 октября 2019

Рассмотрим следующее:

Напомним, что span = max - min + 1;

Пусть Partition P1 будет span из 0..span-1;

Пусть Partition P2 будет span из span..(2*span)-1:

Поместите число в P1, если его нет в P2.

Поместите число в P2, если оноуже в P1.

Как только число введено в P2, не считать его снова .

Если число находится в P1 тогда он уникален .

0 голосов
/ 29 октября 2019

Вы можете получить все значения, которые появляются один раз, используя карту, чтобы подсчитать, сколько раз появился каждый элемент. Затем вы можете уменьшить эту карту до массива уникальных значений:

const findUnique = arr => {
  const mapEntries = [...arr.reduce((a, v) => a.set(v, (a.get(v) || 0) + 1), new Map()).entries()]
  return mapEntries.reduce((a, v) => (v[1] === 1 && a.push(v[0]), a), [])
}

console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([1, 2, 3, 2, 4]))
console.log(findUnique([4, 10, 4, 5, 3]))

Если вы не заботитесь о нескольких уникальных значениях, вы можете просто отсортировать массив и использовать логику вместо проверки каждого значения, при условии, что массив содержит только 2 различных значенияи имеет длину более 2:

const findUnique = arr => {
  a = arr.sort((a, b) => a - b)
  if (arr.length < 3 || new Set(a).size === 1) return null
  return a[0] === a[1] ? a[a.length-1] : a[0]
}

console.log(findUnique([3, 10, 3, 3, 3]))
console.log(findUnique([3, 3, 1]))
console.log(findUnique([3, 1]))
console.log(findUnique([3, 3, 3, 3, 3]))
0 голосов
/ 29 октября 2019

Ваш код сложный, попробуйте это

function findOne(arr) {
  const uniqueItems = [];
  arr.forEach(item => {
    const sameItems = arr.filter(x => x === item);
    if (sameItems.length === 1) {
      uniqueItems.push(item);
    }
  });

  return uniqueItems;
}
console.log(findOne([0, 1, 1, 3, 3, 3, 4]));

Я получаю все уникальные элементы из переданного массива, он может иметь несколько уникальных элементов

0 голосов
/ 29 октября 2019

Я не очень понимаю ваш код. Вы начинаете с первого значения в массиве, затем перебираете массив, пропускаете все то же самое, а затем возвращаете первое, которое не совпадает. Это не найдет уникальные значения, оно просто найдет первое значение, которое не равно первому значению. Так, например, попробуйте это для массива [1,2,2,2,2], и вы получите результат 2 вместо 1, хотя это явно неправильно.

Вместо этого вы можете создать карту каждого значения и его частоты, затем отфильтруйте по тем, которые равны 1 в конце.

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map[val] = (map[val] || 0) + 1;
      return map;
    }, {});
    const values = Object.keys(incidences);
    for (let i = 0; i < values.length; ++i) {
      if (incidences[values[i]] === 1) { return values[i]; }
    }
    return null;
}

EDIT Приведенное выше не сохранит тип значения (т. е. преобразует его в строкувсегда, даже если это был изначально номер). Чтобы сохранить тип, вы можете использовать реальную карту вместо объекта:

function findOne(arr) {
    const incidences = arr.reduce((map, val) => {
      map.set(val, (map.get(val) || 0) + 1);
      return map;
    }, new Map());
    const singletons = Array.from(incidences).filter(entry => entry[1] === 1);
    return singletons.map(singleton => singleton[0]);
}
...