题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4
分析
此题有两种解法,第一种借用辅助空间来实现,遍历一遍记录每个元素出现的次数。再遍历一次,找出只出现一次的元素。
第二种就比较巧妙了,使用了位运算异或,即所有数如果相同,那么他们的结果就会为0,因为相同。所以把所有的数都异或的,则两两清零,只有一个只出现一次的数字会存到最后。
第二种方法实在是妙啊!
解法
解法1
func singleNumber(nums []int) int {
if len(nums) == 1 {
return nums[0]
}
set := make(map[int]byte, len(nums))
for _, v := range nums{
set[v]++
if set[v] == 2 {
delete(set, v)
}
}
for k, v:= range set {
if v == 1 {
return k
}
}
return -1
}
解法2
func singleNumber(nums []int) int {
for i:=1; i < len(nums); i++ {
nums[0] ^= nums[i]
}
return nums[0]
}