260. 只出现一次的数字 III

111 阅读1分钟

题目:
给定一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。
解法: 思想是将这两个数分开 1、对nums所有元素求异或,得到r,找到r第一个1的所在的位置,设为mask。缺失的这两个数在这个位置的取值必然不同。 2、利用mask & 1 是否为0将nums分为2部分,确实的这两个数必然处于不同的部分,而且相同的数字肯定在同一边 3、问题转换为数组中只有一个元素出现了一次,其他的元素都出现了两次。

func singleNumber(nums []int) []int {
	r := 0 
	for i := 0; i < len(nums); i ++ {
		r = r ^ nums[i]
	}

	cnt := 0
	// r有可能是负数呀
	for r != 0 {
		if r & 1 != 0 {
			break
		}
		cnt ++ 
		r = r >> 1
	}
	mask := 1 << cnt
	
	ans1 := 0
	ans2 := 0
	for i := 0; i < len(nums); i ++ {
		if mask & nums[i] == 0 {
			ans1 = ans1 ^ nums[i]
		} else {
			ans2 = ans2 ^ nums[i]
		}
	}
	return []int{ans1, ans2}

}