找出数组中两个只出现一次的数字

问题描述:一个数组中除了两个数字之外,其余数字均出现了两次(或偶数次)。请写出程序查找出这两个只出现一次的数字,要求时间复杂度为O(n),空间复杂度为O(1)

func findTwoNum()  {
   //数组只有两个数没有重复
   arr := [10] int{1, 2, 3, 4, 8, 6, 4, 3, 2, 1}
   re := 0
   //所有数抑或运算
   for _, v := range arr{
      re ^= v
   }

   //查找抑或结果二进制从右往左第一个非0位置index
   index := firstOneIndex(re)

   num1 := 0
   num2 := 0

   for _,v2 := range arr{
      //数组成员index位是1的抑或=num1,非1的抑或num2。 num1 和num2则是要找的元素,因为其他成员重复抑或为0
      if(checkNum(v2, index)){
         //index位是1
         num1 ^= v2
      } else {
         num2 ^= v2
      }
   }
   fmt.Println("num1=",num1,"num2=",num2)




}

func firstOneIndex(re int)  int{
   index  := 0
   for re > 0 {
      if(re&1 == 1){
         break
      }
      index ++
      re = re>>1
   }
   return index
}

func checkNum(num int, index int) bool {
   if((num >> index) & 1 == 1){
      return true
   }
   return false
}
posted @ 2021-02-08 15:15  陆何方  阅读(87)  评论(0)    收藏  举报