数学题单

37 阅读1分钟

1、 找到数组中只出现一次的数字,其余数字出现两次

思路:我们知道在二进制中,两个数在进行异或运算时会得到0 即 (a异或a=0)(a 异或 a = 0)。 所以,数组中所有值的异或结果为只出现一次的数字

// nums = []int{1,1,2,2,3,3,4}
    nums := []int{1,1,2,2,3,3,4}
    var rst int 
    
    for _,num := range nums {
        rst ^= nums
    }
    
    //.....

2、 某个数组中,只有一个数字出现1次,其余数字出现n次(这里以3次为例)

思路:我们可以计算每一位上1的个数,1个个数可能会有3种情况:1\n\n+1。所以我们只要求出每位上1个数对n取余即可

    // nums := []int{1,1,1,2,2,2,3,3,3,4}
    nums := []int{1,1,1,2,2,2,3,3,3,4}
    var ans int32
    for i := 0;i<32;i++{
        cnt := 0
        for _,num := range nums {
            cnt += int32(num) >> i & 1
        }
        ans |= (cnt % 3) << i
    }