题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
找出只出现一次的数,并且不使用额外空间来实现。其余数均出现两次
方法1-字典变量来存放
func singleNumber(_ nums: [Int]) -> Int {
//创建一个字典,没有就添加,有了就删除
var noRepeatDic = [Int:Int]()
for num in nums {
if (noRepeatDic.keys.contains(num)) {
noRepeatDic.removeValue(forKey: num)
}else {
noRepeatDic[num] = num
}
}
return Array(noRepeatDic.keys)[0]
}
方法2-位运算符
func singleNumber(_ nums: [Int]) -> Int {
//位运算符。位异或 ( ^ )相同为0,不同为1
var result = 0
for num in nums {
result = result ^ num //或者 result ^= num
}
return result
}
最后
- 我第一反应想的是排序,然后相邻值比对~ 但是这个好像不符合题意~
- 方法1也可用数组来存放~也是一方法,但是contains方法没字典找得快
- 位运算符,原来是这么用的。跟昨天的set方法一样,我平时都很少用,学习了~~