一个数组中只有两个数字是出现一次,其他所有数字都出现了两次

本题的核心思想就是一个数异或相同的两个数时会等于他本身,所以当0异或这个数组的数字时,最终得到的数字就是需要找到的两个数字异或的结果,然后找到它二进制为1的一位,将原来的数组分为两组,再异或就能得到结果。

#include<stdio.h>
void find(int* arr, int sz)
{
    int i = 0;
    int a = 0;
    int b = 0;
    int c = 0;
    int flag = 0;
    for (i = 0; i < sz; i++)
    {
        a = a ^ arr[i];
    }
    for (i = 0; i < 32; i++)
    {
        if (((a >> i) & 1) == 1)
        {
            break;
        }
        else {
            flag++;
        }
    }
    for (i = 0; i < sz; i++)
    {
        if (((arr[i] >> flag) & 1) == 1)
        {
            b = b ^ arr[i];
        }
        else
        {
            c = c ^ arr[i];
        }
    }
    printf("%d, %d\n", b, c);
}
int main()
{
    int arr[] = { 0, 1, 2, 3, 4, 5, 6, 5, 4, 2, 1, 0 };
    int sz = sizeof(arr) / sizeof(arr[0]);
    find(arr, sz);
    system("pause");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/lly17792230965/article/details/80092455