1、描述
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次,找出那个只出现一次的元素。
例1:输入:[2, 2, 1]
输出:1
例2:输入:[4, 1, 2, 1, 2]
输出:4
2、算法
1)利用数组
思想:利用数组,遍历nums中的每一个元素,如果是新出现则加入数组,如果已经在列表则删除
时间复杂度:O(n^2)
func singleNumber(_ nums: [Int]) -> Int {
/*
利用数组
*/
var temp = [Int]()
for value in nums {
if temp.contains(value){
//如果数组已经包含该数字,则从temp中删除该数字
temp = temp.filter{$0 != value }
}else{
temp.append(value)
}
}
return temp.first!
}
2)哈希表
思想:利用字典记录每个数字出现的次数,最后遍历数组找出只出现一次的数返回
时间复杂度:O(n)
func singleNumber(_ nums: [Int]) -> Int {
/*
哈希表操作
*/
var temp = [Int:Int]()
for num in nums {
if (temp[num] == nil){
temp[num] = 1
}else{
temp.updateValue(temp[num]!+1, forKey: num)
}
}
for (key, value) in temp {
if value == 1{
return key
}else{
continue
}
}
return 0
}
3)位运算–异或
思想:由于 0^a = a,a^a = 0 而数组中除了一个数字是只出现一次的,其他数字均出现两次,所以可以用异或来解决问题
时间复杂度: O(n)
func singleNumber(_ nums: [Int]) -> Int {
/*
异或
*/
var temp = nums[0]
if nums.count > 1{
for i in 1..<nums.count {
temp = temp ^ nums[i]
}
}
return temp
}