输入包含两行,第一行包含两个整数n和k,1<=n<=105,1 < k <= 100,n代表数组arr的长度,第二行n个整数,代表数组arr,数组arr中每个数都是32位整数。
输出一个整数,代表唯一出现1次的数。
7 3 5 4 1 1 5 1 5
4
时间复杂度,额外空间复杂度
。
import java.util.*;
public class Main {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		int n = scanner.nextInt();
        int k = scanner.nextInt();
        int[] base = new int[32];
        int[] arr = new int[n];
        for(int i=0;i<n;i++){
            int[] kBinary = getKBinaryNum(scanner.nextInt(),k);
            baseAdd(base,kBinary,k);
        }
        System.out.print(getResult(base,k));
		
	}
    public static int getResult(int[] base,int k){
        int res = 0;
        int m = 1; 
        for(int i=31;i>=0;i--){
            res += base[i] * m;
            m *= k;
        }
        return res;
    }
    
    
    public static void baseAdd(int[] base,int[] kBinary,int k){
           for(int i=0;i<32;i++){
               base[i] = (base[i]+kBinary[i]) % k;
           }
    }
    
    public static int[] getKBinaryNum(int num,int k){
        int[] arr = new int[32];
        int index = 31;
        while(index>=0){
            arr[index--] = num % k;
            num = num/k;
        }
        return arr;
    }
} #include <iostream>
#include <vector>
using namespace std;
int main()
{
    int k, n, t;
    int xx[32] = { 0 };
    cin >> n >> k;
    vector<int> vec;
    for (int i = 0; i < n; i++)
    {
        cin >> t;
        vec.push_back(t);
    }
    
    for (int i = 0; i < n; i++)
    {
        int z = vec[i];
        for (int j = 31; j >= 0; j--)
        {
            if ((z & 1) == 1)
                xx[j]++;
            z >>= 1;
        }
    }
    int a = 0;
    for (int i = 0; i<32; i++)
    {
        a <<= 1;
        a += xx[i] % k;
    }
    cout << a;
    return 0;
} #include<iostream>
#include <bits/stdc++.h>
#include<vector>
using namespace std;
int main(void) {
    int n,k;cin>>n>>k;
    map<int,int>a;
    int x;
    for(int i=0;i<n;++i) {
        scanf("%d", &x);
        if(a.count(x)) a[x]++;
        else a[x] = 1;
    }
    for (auto it=a.begin();it!=a.end();++it) {
        if(it->second == 1){
            cout<<it->first<<endl;break;
        }
    }
} vec视作32 X n的二维0/1矩阵,统计每一列中1的总数,记为cnt
所有数第i位 1的总数要么是k的倍数,要么是k的倍数+1
多出来的1就是只出现一次的那个数贡献的
#include <iostream>
(720)#include <vector>
#include <bitset>
static const unsigned INT_BIN_LEN = sizeof(int) * 8; //int 32bit长
using BinInt = std::bitset<INT_BIN_LEN>; //使用bitset表示一个int对象
int main(){
    //处理输入
    using namespace std;
    int n, k;
    cin >> n >> k;
    vector<BinInt> vec;
    vec.reserve(n);
    while(n--){
        int num;
        cin >> num;
        vec.push_back(BinInt(num));
    }
    BinInt res;
    for(int i = 0; i<32; ++i){
        int cnt = 0;
        for(BinInt &num : vec){
            if(num.test(i)) ++cnt;
        }
        if(cnt % k) res.set(i);
    }
    cout << int(res.to_ulong()) << endl;
    return 0;
}