簡體   English   中英

我怎樣才能 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]));

我真的不明白你的代碼。 你從數組中的第一個值開始,然后循環遍歷數組,跳過任何相同的值,然后返回第一個不同的值。 那不會找到唯一值,它只會找到不等於第一個值的第一個值。 因此,例如,在數組[1,2,2,2,2]上嘗試它,您將得到 2 而不是 1 的結果,即使這顯然是錯誤的。

相反,您可以創建每個值及其發生率的 map,然后按末尾等於 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;
}

編輯上面不會保留值的類型(即它總是將其轉換為字符串,即使它最初是一個數字)。 要保留類型,您可以使用實際的 Map 而不是 object:

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

考慮以下:

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

Partition P1span 0..span-1

Partition P2spanspan..(2*span)-1

如果不在P2中,則在P1中放置一個數字。

如果數字已經在P1中,則在P2中放置一個數字。

一旦數字在P2中,就不要再考慮它了

如果一個數字在P1中,那么它是唯一的

您可以通過使用 map 計算每個元素出現的次數來獲取出現一次的所有值。 然后,您可以將 map 減少為唯一值數組:

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

我從傳遞的數組中獲取所有唯一項目,它可能有多個唯一項目

這是一種更簡單快捷的方式:

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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM