剑指offer-面试题56_2-数组中唯一只出现一次的数字-位运算

/*
题目:
	数组中除一个数字只出现一次外,其余数字都出现3次。
*/
/*
思路:
	位运算。
*/

#include<iostream>
#include<cstring>
#include<vector>
#include<algorithm>
#include<map>

using namespace std;

int FindNumsAppearOnce(int data[],int length){
    if(length < 1 || data == nullptr) return -1;

    int intSize = sizeof(int)*8;
    int bitSum[intSize] = {0};

    //计算各位的1的个数
    for(int i = 0; i < length; i++){
        int bisMask = 0;
        for(int j = intSize-1; j>= 0; j--){
            bitSum[j] += ((data[i]>>bisMask) & 1);
            bisMask++;
        }
    }

    //各位上出现3的非整数倍,则该位属于只出现一次的数字
    int bisMask = 0;
    int res = 0;
    for(int i = intSize-1; i >= 0; i--){
        if(bitSum[i] % 3 == 1){
            res += (1<<bisMask);
            bisMask++;
        }
    }
    return res;
}

int main(){
    int data[] = {2,2,2,3,6,4,5,5,4,6,6,5,4,32,32,32};
    cout<<FindNumsAppearOnce(data,sizeof(data)/sizeof(data[0]));
}

   

原文地址:https://www.cnblogs.com/buaaZhhx/p/12108277.html