260. 只出现一次的数字 III

21 阅读1分钟
func test(nums []int) []int {
   tmp := 0
   for _, num := range nums {
      tmp ^= num
   }
   index := 0 // 找到tmp的哪一位不为0 ,表明可以用这一位把数组分成两个数组
   for ; index < 32; index++ {
      if tmp&(1<<index) != 0 {
         break
      }
   }
   ans := []int{0, 0}
   for _, num := range nums {
      if (num>>index)&1 != 0 {
         ans[0] ^= num
         continue
      } else {
         ans[1] ^= num
      }
   }
   return ans
}

思路

1 将所有数异或,出现两次的被抵消,最后的结果是两个只出现一次的数异或结果tmp 2 把第一步的tmp的每一位遍历,找到两个只出现一次的数在哪一位不一样 3 通过这一位将数组分成两个数组来异或 4 注意运算优先级