close

題目

問問大家~如果看到這題會怎麼解呢?

我當初在看到這個題目的時候,可是想了很多的方法!!

想說先用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 的特性

數字 XOR 自己 = 0:任何數字與自己進行 XOR 運算結果都是 0。例如:5 ^ 5 = 0

數字 XOR 0 = 原數字:任何數字與 0 進行 XOR,結果都是自己。例如:5 ^ 0 = 5

交換律與結合律:XOR 可以任意交換運算的順序,例如 :a ^ b ^ c = c ^ a ^ b

 

因為 XOR 在同一個數字上兩次會互相抵銷,因此出現偶數次的數字會被抵銷掉,只剩下出現奇數次的數字。

所以,就可以利用方法reduce累加的特性,透過 XOR 簡化漏漏長的程式碼!

新手の軟體筆記 | 快速清楚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 運算時,與上面講到的一樣。

實際上是在對它們的二進位表示的每一位進行「異或」操作。對於每一位,遵循這個規則

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?如果位元相同(0 和 0 或 1 和 1),則結果為 0。

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?如果位元不同(0 和 1 或 1 和 0),則結果為 1。

 

 

接著來說說,為什麼轉換為二進位是必要的原因

XOR 是位元運算,因此在十進位數字之間進行 XOR 時,會先將它們轉換成二進位然後在每個位元上執行XOR

舉個例子:5 XOR 3

53 轉換成二進位:

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?5 的二進位是 0101

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?3 的二進位是 0011

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?

每一位的計算步驟:

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

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?

所以,5 ^ 3 = 6

接著,計算 6 ^ 4

新手の軟體筆記 | 快速清楚XOR是什麼?^怎麼稱呼?

所以,6 ^ 4 = 2

結果:

因此,5 ^ 3 ^ 4結果是 2

解釋:

這裡,XOR 是從左到右依次進行的,首先 5 ^ 3 給出了 6,然後再將結果 64 進行 XOR,最終結果是 2

分享:(連結是即時進制轉換器

https://tools.yeecord.com/zh-tw/base-converter/dec/bin 

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 小魚吃貨愛旅遊 的頭像
    小魚吃貨愛旅遊

    小魚吃貨愛旅遊

    小魚吃貨愛旅遊 發表在 痞客邦 留言(0) 人氣()