1.在一个数组中找出只出现一次的一个数字,其余数字全部成对出现。
2.在一个数组中找出只出现一次的两个数字,其余数字全部成对出现。
那么,接下来,我们分别对这两个问题进行探讨以及代码实现。
若一个数组中一个数字只出现了一次,其余数字全部成对出现,那么要找出这个出现了一次的数字,办法很简单,对这个数组中的数字进行异或运算就好了,根据异或的性质“相同为0,相异为1”,即可找出该数字。
So,具体算法我们已经知道了,那么,如何用代码实现呢?
代码如下:
#include
#include
int find_num(int arr[], int sz)
{
int i = 0;
int ret = 0;
for (i = 0; i
运行结果:
这样,代码就实现了。
#include
#include
int find_num(int arr[],int sz)
{
int i = 0;
int ret = 0;
int num1 = 0;
int num2 = 0;
int flag = 0; //设置标志位,即1先出现的位置
for (i = 0; i < sz; i++) //首先,异或数组中的所有元素
{
ret ^= arr[i];
}
for (i = 0; i < 32; i++) //然后,找异或后该数字二进制最先出现1的位置
{
if (((ret >> i) & 1) != 1) //找异或后该数字二进制最先出现1的位置
{
flag++;
}
else
break;
}
for (i = 0; i < sz; i++) //最后,将数组分成两个子数组,分别异或得到出现一次的数
{
if (((arr[i] >> flag) & 1) == 1)
{
num1 ^= arr[i];
}
else
num2 ^= arr[i];
}
printf("%d %d\n", num1, num2);
}
void test2()
{
int arr[] = { 1, 1, 2, 2, 3, 4, 5, 5 };
int sz = sizeof(arr) / sizeof(arr[0]);
int ret = find_num(arr,sz);
}
int main()
{
test2();
return 0;
}
运行结果:
这样,找这两个出现一次的数字就实现了。
总结一下:
其实,这两道经典的题目的本质就是掌握异或运算的实质,在此基础上,将问题应用化、简单化,最终对问题进行代码的实现。