嘿嘿~今天我們來聊一個超級有趣的小挑戰。
這個題目應該很適合那些常常覺得「為什麼總是我?」的朋友們~
哈哈,開玩笑的啦!題目是這樣的:
有一個整數陣列 nums
,裡面的每個元素都出現兩次,除了那個倒楣鬼只出現了一次。
沒錯,我們的任務就是找出這個單身汪!但注意囉,我們不只要找到它,還得用線性時間複雜度,外加只能使用固定的額外空間。
這感覺就像是在找那根遺失的針,但放心!我們用 TypeScript 把它找出來!GO~
Given a non-empty array of integers nums
, every element appears twice except for one. Find that single one.
You must implement a solution with a linear runtime complexity and use only constant extra space.
給定一個非空的整數陣列 nums
,其中每個元素都出現兩次,只有一個元素只出現一次。找出這個出現一次的元素。
你必須實現一個線性時間複雜度的解法,並且只能使用固定的額外空間。
Example 1:
Input: nums = [2,2,1]
Output: 1
Example 2:
Input: nums = [4,1,2,1,2]
Output: 4
Example 3:
Input: nums = [1]
Output: 1
function singleNumber(nums: number[]): number {
let result = 0;
for (let num of nums) {
result ^= num; // XOR operation
}
return result;
}
這邊的解法相當精簡巧妙,我們使用了 XOR(異或)運算符號。
XOR 的性質是:相同的數字異或後會得到 0,而任何數字與 0 異或則會保持不變。
這意味著,當我們把所有數字都 XOR 起來後,那些出現兩次的數字就會被互相抵消,只剩下出現一次的單身汪。
result
為 0。nums
陣列中的每一個數字,用 XOR 把它們一一加到 result
中。result
就是我們要找的那個只出現一次的數字。這個題目看似簡單,但限制條件下要達成線性時間與固定空間複雜度,其實就是要把心思放在巧妙的運算上。用 XOR 來抵消重複的數字就剛好符合這個需求,既高效又不需要多餘的空間,真是物美價廉!
「XOR」是位元運算符(Bitwise Operators)中,特別是 ^
(異或運算符)。
以下是與 XOR 系列相關的運算符以及它們的解釋:
^
(XOR, 位元異或)
let a = 5; // 0101 in binary
let b = 3; // 0011 in binary
let result = a ^ b; // 0110 in binary, which is 6
&
(AND, 位元且)
|
(OR, 位元或)
~
(NOT, 位元非)
let a = 10, b = 20;
a = a ^ b;
b = a ^ b;
a = a ^ b;
// 現在 a = 20, b = 10