JZ40 数组中只出现一次的数字

数组中只出现一次的数字

题目:一个整型数组里除了两个数字只出现一次,其他的数字都出现了两次。请写程序找出这两个只出现一次的数字。

思路:

这一题属于位运算的题目,两个数如果相同那么异或运算就为0,将一个变量初始化为0,再与其他数进行异或,不会改变结果,记住一定要记住异或是加法运算。
第一遍全部异或后,得到一个数flag,因为flag一定是两个不同的数异或得到的,那么flag等于1的那一位一定可以将这两个数分开,那么我们再用一次异或就分别找到了这两个数。
func FindNumsAppearOnce( nums []int ) []int {
    // write code here
    if len(nums) < 2 {
        return nil
    }

    xor := 0

    for _, v := range nums {
        xor = xor ^ v
    }

    lowest :=  1 // 我们要想对两者进行分组操作,就是需要找到两者中的那一位不同的二进制,然后得到分组的与值(去&的那个值)
    for xor & lowest == 0 {
        lowest <<= 1
    }

    nums1, nums2 := 0, 0

    for _, v := range nums {
        if lowest & v != 0 {
            nums1 = nums1 ^ v
        } else {
            nums2 = nums2 ^ v
        }
    }

    if nums1 > nums2 {
        return []int{nums2, nums1}
    }

    return []int{nums1, nums2}
}

  

posted @ 2021-04-10 15:50  zqlucky  阅读(57)  评论(0编辑  收藏  举报