版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
一个数组只有两个数字出现了一次,其他的数字成对出现,这里面用到的知识点是异或;
相同的数字之间异或的话最终的结果为0,所以讲整个数组进行异或的话,最终的结果就是那两个值出现一次的数字异或的结果,比如1 1 2 2 3 3 5 6,最终异或的结果就是5 ,6异或的结果。
下面附上代码。
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
void find_num(int arr[], int sz)
{
int i = 0;//循环变量
int pos = 0;//异或中第一个1的位置储存在里面
int tmp = 0;//将整个数组异或的结果储存在里面
int x = 0;//通过pos的分组,将第一组异或的结果储存在里面
int y = 0;//将第二组异或的结果储存在里面
for (i = 0; i < sz; i++)
{
tmp ^= arr[i];
}
for (i = 0; i < 32; i++)
{
if (1 == ((tmp >> i)&1))
{
pos = i;
break;
}
}
for (i = 0; i < sz; i++)
{
if (1 == ((arr[i] >> pos)&1))
{
x ^= arr[i];
}
else
{
y ^= arr[i];
}
}
printf("x = %d, y = %d", x, y);
}
int main()
{
int arr[] = { 1, 2, 3, 1, 2, 3, 6, 5 };
int sz = sizeof(arr) / sizeof(arr[0]); //求出数组的长度
find_num(arr, sz);
system("pause");
return 0;
}
今天能做的事,绝不拖到明天——苏步青