# 如何處理LeetCode 136:只出現一次的數字
## 問題描述
LeetCode第136題"只出現一次的數字"(Single Number)是一個經典的位運算問題。題目描述如下:
> 給定一個非空整數數組,其中除了某個元素只出現一次外,其余每個元素均出現兩次。找出那個只出現了一次的元素。
>
> 示例:
> - 輸入: [2,2,1]
> - 輸出: 1
> - 輸入: [4,1,2,1,2]
> - 輸出: 4
## 初步思考
### 暴力解法
最直觀的想法可能是使用雙重循環遍歷數組,統計每個數字出現的次數:
```python
def singleNumber(nums):
for i in range(len(nums)):
found = False
for j in range(len(nums)):
if i != j and nums[i] == nums[j]:
found = True
break
if not found:
return nums[i]
這種方法的時間復雜度是O(n2),空間復雜度是O(1)。對于大規模數據效率很低。
我們可以使用哈希表來存儲每個數字出現的次數:
def singleNumber(nums):
count = {}
for num in nums:
if num in count:
count[num] += 1
else:
count[num] = 1
for num in count:
if count[num] == 1:
return num
這種方法的時間復雜度是O(n),空間復雜度也是O(n)。雖然比暴力解法好,但仍有優化空間。
這個問題的最優解是利用位運算中的異或(XOR)操作。異或運算有幾個重要特性:
a ^ 0 = a
a ^ a = 0
a ^ b ^ a = (a ^ a) ^ b = 0 ^ b = b
利用這些特性,我們可以將所有數字進行異或運算:
實現代碼非常簡潔:
def singleNumber(nums):
result = 0
for num in nums:
result ^= num
return result
讓我們用第二個示例[4,1,2,1,2]來演示:
最終結果為4,正是只出現一次的數字。
在實際編碼中,我們需要考慮一些邊界情況:
public int singleNumber(int[] nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
int singleNumber(vector<int>& nums) {
int result = 0;
for (int num : nums) {
result ^= num;
}
return result;
}
function singleNumber(nums) {
return nums.reduce((acc, num) => acc ^ num, 0);
}
理解了這個問題的解法后,可以嘗試解決一些變體問題:
LeetCode 136題展示了位運算在解決特定問題時的強大威力。通過分析問題特性并利用異或運算的性質,我們找到了時間復雜度O(n)和空間復雜度O(1)的最優解。這種解法不僅高效,而且代碼簡潔優雅。
關鍵點總結: 1. 理解異或運算的三個重要性質 2. 認識到相同數字異或會抵消的特性 3. 通過遍歷一次數組即可得到結果
掌握這種位運算技巧對于解決類似問題和優化算法性能非常有幫助。在實際編程中,當遇到需要統計或查找特殊元素的場景時,不妨考慮位運算是否適用。
位運算在算法優化和底層系統設計中都有廣泛應用,深入理解這些基礎概念對提升編程能力大有裨益。 “`
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。