只出现一次的数字3

一:题目

在这里插入图片描述

二:解法

1)异或

本题会使用到异或的方法,关于异或运算符及其在C语言中的使用详见此文章。

2)详解

第一步:因为异或是相同为0,相异为1,题目中说到,整个数组中只有两个数出现了一次,其余全部数均出现两次。所以把所有元素都进行异或操作,相同的元素异或为0,所以最终异或的结果一定是,那两个不同元素进行运算结果。假设那两个不同的元素为X1和X2,其结果一定=X1^X2

第二步:这一步就应该要分离出X1和X2。这里举例说明

在这里插入图片描述

在这里插入图片描述

int* singleNumber(int* nums, int numsSize, int* returnSize)
{
    
    
    int ret=0;
    for(int i=0;i<numsSize;i++)
    {
    
    
        ret^=nums[i];
    }
    //第一步:因为异或是<b>相同为0,相异为1</b>,题目中说到,整个数组中只有两个数出现了一次,其余全部数均出现两次。所以把所有元素都进行异或操作,相同的元素异或为0,所以最终异或的结果一定是,那两个不同元素进行运算结果
    int m=0;
    while(m<32)
    {
    
    
        if(ret & (1<<m))
            break;
        else
            ++m;
    }
    //找出ret1的第m位为1

    int x1=0;
    int x2=0;
    for(int i=0;i<numsSize;i++)
    {
    
    
        if(nums[i] & (1<<m))
        {
    
    
            x1 ^= nums[i];
        }
        else
        {
    
    
            x2 ^= nums[i];
        }
    }   
    //找到第M位后,再次探查数组,如果某个数的第m位为,则为X1,反之则为X2
    int* retarr=(int*)malloc(sizeof(int)*2);
    retarr[0]=x1;
    retarr[1]=x2;
    *returnSize=2;
    return retarr;

}

猜你喜欢

转载自blog.csdn.net/qq_39183034/article/details/112758720
今日推荐