「今天我們來嘗試寫一下 136. Single Number!」
看到題目的兩個人,開始打開筆電,躍躍欲試的想直接用迴圈處理掉這個題目。
「先別急,我們趁這個機會來講講 bit operation。」夏天說
「咦⋯⋯夏姐那是什麼?我看之前的兩本書,都沒有提到這個觀念?」
「沒關係,我跟你說」菁菁 google 了一番,花了一點時間跟曉欣解釋布林運算的概念。
「可是⋯⋯這些對二進位數字運作的概念,跟這次的題目有什麼關係呢?」曉欣聽完之後,不解地問。
「你看,我們可以發現,如果一個數字同時對某個數字做兩次 xor
運算,那麼就會回到原本的數字」夏天邊說邊在紙上寫著
a xor b xor b = a
「所以,以這題來說,我們只要將陣列內所有的數字 xor
在一起,就會得到落單的數字了」
「這樣寫好神奇喔」兩位一邊感嘆,一邊看著夏天寫下答案
class Solution {
fun singleNumber(nums: IntArray): Int {
var ans = 0
for(element in nums) {
ans = ans xor element
}
return ans
}
}
看到 Accept 之後,夏天一邊喝著美式,一邊等兩位消化這段邏輯。
「如何?還想得通嗎?」夏天笑笑的看著緊盯螢幕發呆的兩位。
「還⋯⋯還可以吧」曉欣不確定的說。
「那我們再改寫一下」夏天一邊說,一邊調整程式碼
class Solution {
fun singleNumber(nums: IntArray): Int {
var ans = 0
nums.forEach {
ans = ans xor it
}
return ans
}
}
「還可以這樣寫呀!這邊的 it
太奇妙了吧!」
「原來書上說到的 it
是這樣用的,這樣寫看起來變得好合理」
「如果兩位還可以接受的話,那我再換個寫法囉」看到兩位興奮的表情,夏天又寫了另一種答案
class Solution {
fun singleNumber(nums: IntArray)
= nums.reduce { ans, element -> ans xor element }
}
「哇⋯⋯這」曉欣和菁菁面面相覷。
看到連這樣寫都可以通過,頭腦開始冒煙的兩人,夏天笑得很開心。
「今天先到這邊吧——兩位可以回家再研究看看。」