《leetCode》:Single Number II

题目

Given an array of integers, every element appears three times except for one. Find that single one.

Note:
Your algorithm should have a linear runtime complexity. Could you implement it without using extra memory?

思路一

由于在数组中除了一个数之外的其它数都出现3次,则对于每个数的32个bit位来看,每个bit位出现的1的次数模3,我们所要求的数在该bit位的值就是此余数。也就是说:
int 数据共有32位,可以用32变量存储 这 N 个元素中各个二进制位上 1 出现的次数,最后 在进行 模三 操作,如果为1,那说明这一位是要找元素二进制表示中为 1 的那一位。时间复杂度为:O(32n),空间复杂度为O(32)
这个算法是一个通用的算法,如果把出现3次改为 k 次,那么只需模k就行了

实现代码如下:

/* 所有数均出现3次,除了一个只出现一次 */
#define N_Bit 32
int singleNumber(int* nums, int numsSize) {
    if(nums==NULL||numsSize<1){
        return 0;
    }
    int *bitNum=(int *)malloc(N_Bit*sizeof(int));
    if(bitNum==NULL){
        exit(EXIT_FAILURE);
    }
    memset(bitNum,0,N_Bit*sizeof(int));
    for(int i=0;i<numsSize;i++){
        int value=nums[i];
        for(int j=0;j<N_Bit;j++){
            bitNum[j]+=(value&1);
            value=(value>>1);
        }
    }
    int res=0;
    for(int i=0;i<N_Bit;i++){
        bitNum[i]=bitNum[i]%3;
        res|=(bitNum[i]<<i);
    }
    return res; 
}

你可能感兴趣的:(LeetCode,算法,number,single)