1. 数组中唯一出现过一次的数
利用异或的特性:x ^ y ^ x = y ^ x ^ x = y。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int len=15;
int a[7]={2,4,3,3,2,5,5};
int main()
{
int ans=a[0];
for(int i=1;i<7;i++)
{
ans^=a[i];
}
printf("%d
",ans);
return 0;
}
2. 一个数组里除了一个数字之外,其他数字出现了n次
我们把这个数分解成二进制,计算出每一位出现1的个数,我们知道如果多次出现的话,1的个数是能够整除这个n,如果发现这个n 不能够被 整除的时候,我们就知道那个唯一的数字转换为二进制的时候在这一位上会分解到,我们把这个再转换为十进制的数即可。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int len=15;
int a[7]={2,3,3,3,4,4,4};
int b[32];
int main()
{
for(int i=0;i<=6;i++)
{
for(int j=0;j<32;j++)
{
b[j]+=((a[i]>>j)&1);
}
}
int ans=0;
for(int i=0;i<32;i++)
{
if(b[i]%3!=0)
{
ans+=(1<<i);
}
}
printf("%d
",ans);
return 0;
}
2. 找出数组唯一出现过两次的数组,但这是用1001个整数组成的数组,这些整数是任意排列的,但是你知道所有的整数都在1到1000(包括1000)之间。此外,除一个数字出现两次外,其他所有数字只出现一次。
这个来说主要用到的是数学知识,1001个数,有一个出现了两次,那么我把这1001个数加起来,用和减去1到1000的和,很明显,差就是出现了两次的那个数了。
int findd(int a[])
{
int sum1=0,sum2=0;
for(int i=0;i<=1000;i++)
sum1+=a[i];
for(int j=1;j<=1000;j++)
sum2+=j;
return sum1-sum2;
}
3. 找出数组唯一出现过两次的数组,但是数值任意。
这个感觉只能用Hash 去做了。
int findd(int a[])
{
int hashh[1001]={0};
int x=0;
for(int i=0;i<1001;i++)
{
if((++hashh[a[i]])==2)
{
x=a[i];
break;
}
}
return x;
}