题目描述
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案
方法一:位运算
解题思路
- 数组中有两个元素出现了一次。其余元素都出现了两次,将全部元素进行异或操作,最终结果是只出现了一次的两个数字的异或结果
- 该结果为1的位上说明res1和res2不相同
- 相反数相与得到一个只有为1的位上不同(相反数相与得到该数最低位),其余位上均为0的数,以此为依据将数组分为两部分
- 第一部分是和该数相与为0的,第二部分是与该数相与为1的。
- 因为res1和res2在该位上值不同,所以与该数相与,会将res1和res2分到两个部分
- 然后将两部分分别异或,两部分中其余相同的元素都会被抵消,只剩下res1和res2
代码实现
func singleNumber(nums []int) []int {
diff := 0
for _, v := range nums {
diff ^= v
}
div := diff & (-diff)
res := make([]int, 2)
for _, v := range nums {
if v&div == 0 {
res[0] ^= v
} else {
res[1] ^= v
}
}
return res
}
方法二:hash法
解题思路
- 将全部元素存到map中,统计每个元素出现次数
- 遍历map,出现一次的就是res1和res2
代码实现
func singleNumber(nums []int) []int {
countMap := make(map[int]int, 0)
for _, v := range nums {
count, ok := countMap[v]
if ok {
countMap[v] = count+1
} else {
countMap[v] = 1
}
}
res := make([]int, 0)
for k, v := range countMap {
if v == 1 {
res = append(res, k)
}
}
return res
}
版权声明:本文为yc______原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。