列表

详情


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

描述

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

数据范围:  ,  , 
进阶:时间复杂度 ,空间复杂度 



示例1

输入:

[5,4,1,1,5,1,5],3 

输出:

4 

示例2

输入:

[2,2,1],2

输出:

1

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++ 解法, 执行用时: 3ms, 内存消耗: 544KB, 提交时间: 2021-07-27

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int count[32]={0};
        for(int num:arr){
            for(int i=0;i<32;i++){
                count[i]+=num&1;
                num/=2;
            }
        }
        int res=0;
        for(int i=0;i<32;i++){
            res<<=1;
            res|=count[31-i]%k;
        }
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 548KB, 提交时间: 2021-07-27

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int num[32];
        for (int i = 0; i < 32; ++i) {
            int tmp = 0;
            for (const int num : arr) {
                tmp += (num >> i & 1);
            }
            num[i] = tmp;
        }
        int res = 0;
        for (int i = 0; i < 31; ++i) {
            if (num[i] % k) res += (1 << i);
        }
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 552KB, 提交时间: 2021-08-01

class Solution {
public:
    //利用哈希表统计每个数出现的次数
//    int foundOnceNumber(vector<int>& arr, int k) {
//        unordered_map<int, int> mp;
//        //统计每一个数组出现的次数,O(n)
//        for(int& e : arr){
//            mp[e]++;
//        }
//        
//        //找出只出现一次的数字
//        for(pair<int, int>p : mp){
//            if(p.second == 1)
//                return p.first;
//        }
//        return -1;
//    }
    
    //位运算:统计二进制每位中每个元素的和;进行取模运算,余数等于1的那位表示单独出现的数
    int foundOnceNumber(vector<int>& arr, int k) {
        int res = 0;
        for(int i = 0; i < 32; ++i){
            int count = 0;
            for(auto e : arr)
                if(e&(1<<i)) ++count;
            if(count % k == 1) res ^= (1 << i);
        }
        return res;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 580KB, 提交时间: 2021-07-25

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int sum= 0;
        for(int i = 31;i>=0;i--){//int型32位,外层循环32次
            int cnt = 0;
            for(int j=0;j<arr.size();j++){
                cnt+=(arr[j]>>i)&1;//获得每个数字第i位的和O(n)
            }
            sum=2*sum+cnt%k;//其他数字都出现了k次,故余数是只出现一次的当前位,二进制转为十进制
        }
        return sum;
    }
};

C++ 解法, 执行用时: 3ms, 内存消耗: 624KB, 提交时间: 2021-08-03

class Solution {
public:
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 
     * @param arr intvector 
     * @param k int 
     * @return int
     */
    int foundOnceNumber(vector<int>& arr, int k) {
        // write code here
        int sum;
        int res=0;
        int len=arr.size();
        int cnt=0;
        while(cnt<32)
        {
            sum=0;
            for(int i=0;i<len;i++)
            {
                sum+= arr[i] & 1;
                arr[i]>>=1;
            }
            
            res^=((sum%k)<<cnt);
            cnt++;
        }
        return res;
    }
};

上一题