260. 只出现一次的数字 III

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/scylhy/article/details/87892248

260. 只出现一次的数字 III

给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。

示例 :

输入: [1,2,1,3,2,5]
输出: [3,5]
注意:

结果输出的顺序并不重要,对于上面的例子, [5, 3] 也是正确答案。
你的算法应该具有线性时间复杂度。你能否仅使用常数空间复杂度来实现?

package main
import "fmt"
func singleNumber(nums []int) []int {
	single:=0
	for _,j:=range nums{
		single^=j
	}
	mask:=single&-single //选取mask,因为异或所以a,b中一定有一个在该位是1,另一个是0
	var res [2]int
	for _,j:=range nums{
		if mask&j==mask{ //但其他数据也可能和mask相同,但因为偶数次,被异或消除了
			res[0]^=j    //最终,偶数次的在mask和非mask下都被消了,只剩下a,b 即为所求,且分开
		}else{
			res[1]^=j
		}
	}
	return res[:]
}
/*
期考如果
k个single(k>2),但是可能得到的xor是0,那么久无法进行mask,因为xor为0,k个数在该同一位上,可能是偶数个1,也可能是全0
但k=2是,xor为1,只有0,1这种可能
k>2,该方法就不奏效了
*/
func main(){
	fmt.Println(singleNumber([]int{1,2,1,3,2,5}))
}

猜你喜欢

转载自blog.csdn.net/scylhy/article/details/87892248