数组中只出现一次的数(其它数出现k次)

Posted vector6_

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数组中只出现一次的数(其它数出现k次)相关的知识,希望对你有一定的参考价值。

数组中只出现一次的数(其它数出现k次)

给定一个整型数组 arr 和一个整数 k(k>1)。
已知 arr 中只有 1 个数出现一次,其他的数都出现 k 次。
请返回只出现了 1 次的数。

class Solution {
public:
    /**
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    /*
    出现k次就不能再用异或的方法了,因为k(奇数)个相同的数异或还是得到本身。但是还是可以采用位运算的思想,因为出现k(奇数)次的数字每个位(0或者1)也是出		现k(奇数)次,因此可以每一位的和能够被k整除(对k取余为0)。所以如果把每个数的二进制表示的每一位加起来,对于每一位的和,如果能被k整除,那对应那个只出现	  一次的数字的那一位就是0,否则对应的那一位是1。
    */
    int foundOnceNumber(vector<int>& arr, int k) {
        if(k<=0 || arr.size()==0)
            return -1;
        int res = 0;
        for(int i=0; i<32; ++i)
        {
            int bit = 0;
            for(int j=0; j<arr.size(); ++j)
            {
                bit += (arr[j]>>i)&1; //右移i位与0000001求余得到最后一位(循环中当前第i位)的数值
            }
            res |= (bit%k)<<i;        //求余判断该为是否为重复数值,左移恢复原位置,或运算组合
        }
        return res;
    }
};

以上是关于数组中只出现一次的数(其它数出现k次)的主要内容,如果未能解决你的问题,请参考以下文章

数组中只出现一次的数字

剑指offer数组中只出现一次的数

数组中只出现一次的数

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

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

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