1 数组中数字都两两相同,只有一个不同,找出该数字
#include <iostream>
using namespace std;
int findUnique(int* a, int len);
int findUnique2(int* a, int len);
void main()
{
int a[] = {1,2,5,3,3,2,1};
int b = findUnique(a,7);
cout<<b<<endl;
}
//写法一
int findUnique(int* a, int len)
{
int temp = a[0];
for (int i = 1; i < len; i++)
{
temp ^= a[i];
}
return temp;
}
//写法二:
int findUnique2(int* a, int len)
{
int temp;
int index = -1;
bool b;
int i,j;
for (i = 0; i < len; i++)
{
b = false;
temp = a[i];
for (j = 0; j < len; j++)
{
if (j != i && temp == a[j])
{
b = true;
break;
}
}
if (b == false)
{
index = i;
return a[index];
}
}
return -1;
}
2 数组中数字两两相同,有两个不同,找出这两个
一问题描述
一个数组中,存在两个只出现一次的数字,其余的数字均出现两次。要求在时间复杂度o(n),空间复杂度为o(1)的情况下找出这两个数字。
二 问题分析
此题实际考察了,对位操作的理解。首先进行简化,考虑只有一个数组中,只存在出现了一次的一个数字,其余数字在数组中出现两次,试找出这个数字。
三 解决方案
首先 回忆 异或操作,任意数字与自身相异或,结果都为0.
还有一个重要的性质,即任何元素与0相异或,结果都为元素自身。
解决方案:
1 从数组的起始位置开始,对元素执行异或操作,则最后的结果,即为此只出现了一次的元素。
2 题目中,数组中存在两个不同的元素,若是能仿造上述的解决方案,将两个元素分别放置在两个数组中,然后分别对每个数组进行异或操作,则所求异或结果即为所求。
3 首先对原数组进行全部元素的异或,得到一个必然不为0的结果,然后判断该结果的2进制数字中,为1的最低的一位。然后根据此位是否为1 ,可以把原数组分为两组。则两个不同的元素,必然分别在这两个数组中。
4 然后对两个数组,进行异或操作,即可得到所求。
#include <iostream>
using namespace std;
int findUnique(int* a, int len);
void findTwo(int* a, int& one, int& two, int sum,int len);
void main()
{
int a[10] = {3, 5, 8, 8 ,5, 3, 1, 4, 4, 10};
int sum = findUnique(a,7);
int one;
int two;
findTwo(a,one,two,sum,10);
cout<<one<<endl;
cout<<two<<endl;
}
int findUnique(int* a, int len)
{
int temp = a[0];
for (int i = 1; i < len; i++)
{
temp ^= a[i];
}
return temp;
}
void findTwo(int* a, int& one, int& two, int sum, int len)
{
unsigned int flag = 1;
while (flag)
{
if (flag & 1)
{
break;
}
flag <<= 1;
}
one = two = 0;
for (int i = 0; i < len; i++)
{
if (a[i] & flag)
{
one ^= a[i];
}
else
{
two ^= a[i];
}
}
}
3 题目:一个数组里,除了三个数是唯一出现的,其余的都出现偶数个,找出这三个数中的任一个。比如数组元素为【1, 2,4,5,6,4,2】,只有1,5,6这三个数字是唯一出现的,我们只需要输出1,5,6中的一个就行。
#include <iostream>
using namespace std;
int findUnique(int* a, int len);
int findOnly(int* a, int sum, int len);
void main()
{
int a[7] = {1,2,4,5,6,4,2};
int sum = findUnique(a,7);
int num = findOnly(a,sum,7);
cout<<num<<endl;
}
int findUnique(int* a, int len)
{
int temp = a[0];
for (int i = 1; i < len; i++)
{
temp ^= a[i];
}
return temp;
}
int findOnly(int* a, int sum, int len)
{
unsigned int flag = 1;
while (flag)
{
if (flag & 1)
{
break;
}
flag <<= 1;
}
int one,two,countOne,countTwo;
one = two = countOne = countTwo = 0;
for (int i = 0; i < len; i++)
{
if (a[i] & flag)
{
one ^= a[i];
countOne++;
}
else
{
two ^= a[i];
countTwo++;
}
}
if (countOne & 1)
{
return one;
}
else
{
return two;
}
}