我如何 select 数组中的唯一元素?

How can I select a unique element in the array?

我正在尝试解决在数组中查找唯一元素的任务。 到目前为止,我设法解决了 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]));

我不是很懂你的代码。您从数组中的第一个值开始,然后遍历数组,跳过任何相同的值,然后 return 第一个不相同的值。这不会找到唯一值,它只会找到不等于第一个值的第一个值。因此,例如,在数组 [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 以上不会保留值的类型(即它会始终将其转换为字符串,即使它最初是一个数字)。要保留类型,您可以使用实际的 Map 而不是对象:

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]);
}

你可以得到所有出现一次的值,通过使用一个映射来统计每个元素出现了多少次。然后,您可以将该映射缩减为唯一值数组:

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]))

你的代码很复杂,试试这个

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]));

我正在从传递的数组中获取所有唯一项,它可能有多个唯一项

考虑以下因素:

回想一下 span = max - min + 1;

Partition P1 来自 0..span-1;

span

Partition P2span 来自 span..(2*span)-1:

如果不在 P2 中,请将数字放在 P1 中。

如果数字已经在 P1 中,请在 P2 中放置一个数字。

一旦号码在P2,不再考虑.

如果一个数字在 P1 中,那么它是唯一的

这种方式更简单快捷:

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
}