您的位置:首页 > 其它

数组中只出现一次的问题(异或问题)

2017-08-10 20:53 169 查看
具体描述:

在一个整型数组中,数组都是成对出现,只有两个元素为单独的元素,求出这两个元素的值。

思路:

1、此处为异或预算符的经典问题,两个相同值的异或运算后的值为0;

2、首先将数组的所有元素做异或运算,最后得到的是两个单独元素异或后的值 (因为相同元素异或后的值均变成0);

3、两个单独元素肯定会有某一位或者几位是不同的,找出要么为0,要么为1,我们可以根据此位为0或者1,将数组元素分为两个部分,两个部分中,分别各有一个单独的元素,再做一会运算,则找到了这两个值。

代码描述

#include <iostream>

void FindNumsAppearOnce(int (&a)[6])
{
//存放数组中所有元素异或后的值,相同值的异或为零,最后存放的是两个不同元素异或后的值

int value = 0;
int num1,num2;   //存放不同数组中不相同的值
int flag = 1;    //根据flag的不同将数组元素分为两部分
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
value ^= a[i];
}
num1 = num2 = value;    //异或后的值赋给两个元素作为初值
while ((value & flag) == 0)
{
flag <<= 1;         //找到1,1就是单独两个元素不同的那一位
}
for (int j = 0; j < sizeof(a) / sizeof(a[0]); j++)
{
if ((flag & a[j]) == 0)
{
num1 ^= a[j];
}
else {
num2 ^= a[j];
}
}

std::cout << "不重复的数组元素分别为:" << "\n"  << "num1 = " <<num1 << "  num2 = "<< num2;
}

int main(void)
{
int a[6] = { 2,4,5,2,5,6 };
FindNumsAppearOnce(a);
getchar();

return 0;
}


后记

该问题在做算法题目是看到,在此处做记录,以备日后查看学习。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: