問問大家~如果看到這題會怎麼解呢?
我當初在看到這個題目的時候,可是想了很多的方法!!
想說先用toSorted做排序,接著用for迴圈分組相同的數字並計算次數,並透過內部迴圈計算相同數字的次數,
最後,若該數字出現的次數為奇數,則回傳該數字。
但是,其實可以不用打這麼長,只要用XOR『^』+reduce方法就可以解決~
XOR
是「Exclusive OR」的縮寫,它是一種位元運算,通常用於比較兩個位元(binary)值是否相同。
在程式語言中,^
這個符號通常稱為「caret」。不過,當它用作 XOR 運算符時,通常會直接稱為「XOR」,而不是特別提到 caret
。
例如,在討論 a ^ b
時,會說「a XOR b
」,而不是「a caret b
」。
XOR
的運作方式是:若兩個位元不同,結果為 1,若相同,結果為 0。這個運算對應的符號是『 ^ 』。
XOR 的特性
數字 XOR 自己 = 0:任何數字與自己進行 XOR 運算結果都是 0。例如:5 ^ 5 = 0
。
數字 XOR 0 = 原數字:任何數字與 0 進行 XOR,結果都是自己。例如:5 ^ 0 = 5
。
交換律與結合律:XOR 可以任意交換運算的順序,例如 :a ^ b ^ c = c ^ a ^ b
。
因為 XOR 在同一個數字上兩次會互相抵銷,因此出現偶數次的數字會被抵銷掉,只剩下出現奇數次的數字。
所以,就可以利用方法reduce累加的特性,透過 XOR 簡化漏漏長的程式碼!
解釋:
1、reduce
方法對陣列中的每個元素進行 XOR 運算 (acc ^ num
)。
2、因為 XOR 的特性,同一個數字 XOR 自己會得到 0(如 5 ^ 5 = 0
)
而 0 與任何數字 XOR 不變(如 0 ^ 5 = 5
),所以出現偶數次的數字會在 XOR 運算中互相抵消為 0,最後只會剩下出現奇數次的那個數字。
更多例子:
以 [1, 1, 2, 2, 3]
為例,我們希望找出只出現奇數次的數字 3
:
1、逐步計算:1 ^ 1 ^ 2 ^ 2 ^ 3
2、1 ^ 1 = 0
(因為相同數字會抵消)
3、0 ^ 2 ^ 2 = 0
(同理,2 ^ 2
也抵消)
4、0 ^ 3 = 3
因此,結果是 3
,這就是我們要找的出現奇數次的數字。
結論:
在 JavaScript 中,^
就是 XOR 運算符,可以快速找出一組數字中只出現奇數次的數字,非常適合解決「成對消除」的問題。
另外!!二進位與XOR計算時有什麼關聯?
轉換數字為二進位與 XOR 計算有直接的關聯,因為 XOR 是一種位元(bitwise)運算,意味著它在數字的二進位表示上進行操作。
每個數字在電腦中都是以二進位形式存儲的,因為現在電腦只能跟你說是或不是,是等於0而不是等於1,所以都是用二進位法方式。
而 XOR 運算會對這些二進位的每一位(bit)進行操作。
XOR 計算的原理:位元對位元運算(上面有講到,再複習)
當我們對兩個數字進行 XOR 運算時,與上面講到的一樣。
實際上是在對它們的二進位表示的每一位進行「異或」操作。對於每一位,遵循這個規則:
如果位元相同(0 和 0 或 1 和 1),則結果為 0。
如果位元不同(0 和 1 或 1 和 0),則結果為 1。
接著來說說,為什麼轉換為二進位是必要的原因?
XOR 是位元運算,因此在十進位數字之間進行 XOR 時,會先將它們轉換成二進位,然後在每個位元上執行XOR。
舉個例子:5 XOR 3
將 5
和 3
轉換成二進位:
5
的二進位是 0101
3
的二進位是 0011
每一位的計算步驟:
1、最右邊的位:1 ^ 1 = 0
2、第二位:0 ^ 1 = 1
3、第三位:1 ^ 0 = 1
4、最左邊的位:0 ^ 0 = 0
最終結果是 0110
,也就是十進位的 6
。
接著,你是不是會搞混?為什麼是6?(如果不會搞混的話就表示懂了!!)
再提醒一次!!
為什麼 XOR 運算適合找出奇數次出現的數字?
在 XOR 運算中,相同的數字 XOR 自己會變成 0
(因為每一位都相同,會互相抵消)。
因此,在一組數字中,如果每個數字出現偶數次,最終結果會是 0
,因為它們都會互相抵消。
而如果某個數字出現奇數次,它會「剩下來」,成為最終的結果。
所以上面的數字因為不同所以留下來做進位。
例子:在 [5, 3, 5]
中,因為 5
出現兩次(會抵消),只剩下 3。
5 ^ 3 ^ 5 = (5 ^ 5) ^ 3 = 0 ^ 3 = 3
那如果是例子:[5, 3, 4]
==> 5 ^ 3 ^ 4
會等於多少呢?(注意,是不同數字時)
讓我們一步一步來計算 5 ^ 3 ^ 4
。
步驟 1:將每個數字轉換為二進位
► 5
的二進位是 0101
► 3
的二進位是 0011
► 4
的二進位是 0100
步驟 2:進行 XOR 計算
首先計算 5 ^ 3
:
所以,5 ^ 3 = 6
。
接著,計算 6 ^ 4
:
所以,6 ^ 4 = 2
。
結果:
因此,5 ^ 3 ^ 4
的結果是 2
。
解釋:
這裡,XOR 是從左到右依次進行的,首先 5 ^ 3
給出了 6
,然後再將結果 6
與 4
進行 XOR,最終結果是 2
。
分享:(連結是即時進制轉換器)
https://tools.yeecord.com/zh-tw/base-converter/dec/bin
留言列表