簡體   English   中英

在數組中找到未配對的元素 - 這是如何工作的?

[英]find unpaired element in array - how does this work?

有一個關於如何在數組中找到未配對元素的問題。 因此,如果一個元素在數組中出現 3 次、5 次或任何不成對的時間。

最快的方法(它工作正常:)是這樣的:

function pairing (A) {
  var s = new Set; 
  A.forEach(function(v) {
    s.delete(v) || s.add(v)
  });

  return s.values().next().value;
}

const arr = [1, 2, 5, 1, 2, 5, 7, 8, 7, 7, 8, 7, 1, 1, 3];
console.log(pairing(arr));

結果它會給出3 ,這是未配對的元素。

該解決方案有效,但我不知道它的作用。 請有人給我一個解釋!

這是什么線:

s.delete(v) || s.add(v) 

我無法解釋。

和這個:

s.values().next().value; 

?

請詳細說明這里發生了什么。

謝謝 !

您發布的 function 的簡化版。 希望現在可以理解了

 var set = new Set(); const arr = [1, 2, 5, 1, 2, 5, 7, 8, 7, 7, 8, 7, 1, 1, 3]; arr.forEach(ele => { if(set.has(ele)){ set.delete(ele); } else { set.add(ele); } }) console.log(set.values().next().value); // This gives the element left over in set which is unpaired.

在此處輸入圖像描述

邏輯或運算符 ( || )短路並返回第一個不為假(或假,但與此處無關)的值。

如果元素被刪除, Set#delete返回 true,即它最初存在於集合中,否則返回 false。 如果元素被添加, Set#add返回 true,即它在集合中不存在,否則返回 false。

因此, s.delete(v) || s.add(v) s.delete(v) || s.add(v)實際上是說刪除v如果它已經存在於集合中; 否則,添加它。 這是由於邏輯或運算符的短路而起作用的:如果set.delete(v)返回 true,則永遠不會執行s.add(v)

Set#values按插入順序返回集合值的迭代器。 .next()從迭代器中獲取下一個元素, .value獲取該元素的值。 在這種情況下,它返回Set的第一個也是唯一的元素,它是未配對的元素。

另一方面,解決整數問題的標准和最有效的方法是應用按位異或 ( ^ ) 運算符 由於所有整數a ^ a === 0 ,簡單地對數組中的所有數字進行異或運算即可找到出現奇數次的數字。

 const arr = [1, 2, 5, 1, 2, 5, 7, 8, 7, 7, 8, 7, 1, 1, 3]; function unpaired(arr){ return arr.reduce((acc,curr)=>acc^curr,0); } console.log(unpaired(arr));

s.delete(v) || s.add(v) - 如果集合中存在則刪除一個值,如果集合“s”中不存在則添加。

s.values().next().value; - 這個返回集合中剩余的值(未配對的)

根據代碼 -

 function pairing (A) { var s = new Set; A.forEach(function(v) { console.log(s) s.delete(v) || s.add(v) }); return s.values().next().value; } const arr = [1, 2, 5, 1, 2, 5, 7, 8, 7, 7, 8, 7, 1, 1, 3]; console.log(pairing(arr));

}

常量 arr = [1, 2, 5, 1, 2, 5, 7, 8, 7, 7, 8, 7, 1, 1, 3]; 控制台.log(配對(arr));

output 是

在此處輸入圖像描述

暫無
暫無

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

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