只出现一次的数字

给定一个整型数组nums,其中恰好有两个元素出现一次,其余元素都出现两次,找出只出现一次的那两个元素。

分析有道类似的题目是只有一个元素出现一次,那么利用异或的特性,相同数字异或为0,异或结果不受顺序影响,将所有元素异或在一起最终结果就是只出现一次的元素。本题改成了两个元素未重复,如果将所有元素异或最终结果将是两个仅出现一次的元素的异或值。如何分开始终想不出来,看了答案才明白,最终的异或值必定是一个非0值,它的二进制也必定是一个至少包含一个1的数字,其中二进制位上的1说明这两个目标数字的这一二进制位不同,才会出现1,那么按照这一标准(该二进制位数字的不同)将这个数组分开,这两个目标数字必定分在不同两组,而两组数字分别异或就回到了最原始的题目。

#include <stdio.h>

int main()
{
    int arr[8]={1,1,2,2,4,5,7,7};
    int i;
    int sz=sizeof(arr)/sizeof(arr[0]);
    int ret=0;//记录所有元素异或结果 
    int num=0;//记录异或结果二进制第几位是1 
    int m=0;//记录第一组异或结果
    int n=0;//记录第二组异或结果 
    for(i=0;i<sz;i++) 
    {
        ret^=arr[i];
    }
    while(ret)
    {
        num++;
        if(ret%2)
        {
            break;
        }
        ret=ret/2;
    }
    for(i=0;i<sz;i++)
    {
        if(arr[i]&num)//num的二进制&目标元素恰好可以判断该位是否为1 
        {
            m^=arr[i];
        }
        else
        {
            n^=arr[i];
        }
    }
    printf("这两个数字分别是%d %d",m,n);
    return 0;
}

 

posted @ 2021-05-13 19:48  偶遇的  阅读(64)  评论(0)    收藏  举报