請實(shí)現(xiàn)一個函數(shù),給定一個整數(shù)數(shù)組,找出數(shù)組中第一個只出現(xiàn)一次的數(shù)字。
【示例】
給定數(shù)組[2, 2, 1]
,返回1
;給定數(shù)組[4, 1, 2, 1, 2]
,返回4
。
答案
func findFirstUniqueElement(_ arr: [Int]) -> Int? {
var map = [Int: Int]()
for value in arr {
if map[value] == nil {
map[value] = 1
} else {
map[value]! += 1
}
}
for (key, value) in map {
if value == 1 {
return key
}
}
return nil
}
// 測試用例
print(findFirstUniqueElement([2, 2, 1]) ?? "") // 輸出:1
print(findFirstUniqueElement([4, 1, 2, 1, 2]) ?? "") // 輸出:4
知識點(diǎn)詳解:
- 字典(Dictionary)的使用
- 創(chuàng)建字典變量來存儲數(shù)字和出現(xiàn)次數(shù)
- 根據(jù)key設(shè)置和訪問value
- 遍歷字典的key和value
- 數(shù)組的遍歷
- 使用for-in循環(huán)遍歷數(shù)組
- 訪問數(shù)組元素并更新字典
- 算法
- 使用字典進(jìn)行統(tǒng)計計數(shù)
- 找到滿足特定條件的鍵值
算法思路
- 使用字典dict來記錄每個數(shù)字出現(xiàn)的次數(shù)。
- 遍歷數(shù)組nums,將每個數(shù)字出現(xiàn)的次數(shù)記錄在dict中。
- 再遍歷dict,找出只出現(xiàn)一次的數(shù)字,也就是字典value為1的key。
- 如果不存在只出現(xiàn)一次的數(shù)字,返回-1。
時間復(fù)雜度分析
算法中有兩次遍歷數(shù)組的循環(huán),所以時間復(fù)雜度與數(shù)組長度n線性相關(guān),是O(n)。
第一層for循環(huán)需要遍歷一次數(shù)組,復(fù)雜度是O(n)。
第二層for循環(huán)需要遍歷字典,字典中的元素最多和數(shù)組元素個數(shù)n一樣多,復(fù)雜度也是O(n)。
總時間復(fù)雜度為兩部分之和,即O(n) + O(n),仍然是O(n)。
空間復(fù)雜度分析
算法中使用了一個字典來存儲每個元素出現(xiàn)的次數(shù),字典最多需要存儲n個數(shù)字,所以額外空間復(fù)雜度為O(n)。
數(shù)組本身占用的空間可以看作是輸入的一部分,不考慮在空間復(fù)雜度分析中。
所以總空間復(fù)雜度為 O(n)。
BTW
感謝各位簡友的寶貴時間與意見!文章難免有疏漏或錯誤,如有涉及不當(dāng)之處,還望能夠提出寶貴意見。感激不盡!