找出数组中出现次数为奇数个的3个数

//一个数组,其中只有3个数出现的个数是奇数个,其他的数均出现偶数个,请找出这3个数
#include<iostream>
using namespace std;
//将数组划分成两部分,下标在pivot之前(包括pivot)的数<=average,之后的>average
int partion(int arr[],int b,int e){
int length=e-b+1;
int sum=0,ave;
for(int i=b;i<=e;i++){
sum+=arr[i];
}
ave=(int)sum/length;
i=b;
    int j=e;
while(i<j){
while(arr[i]<=ave&&i<j) i++;
while(arr[j]>ave&&i<j) j--;
        int temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
if(arr[i]<=ave){
return i;
}
    else return i-1;
}
//找出个数为奇数个的数
void findingOdd(int c[],int b,int e){
int length=e-b+1;
//当数组中存在3个或1个个数为奇数个的数的情况(此时数组总元素个数为奇数;划分后一定是如下情况:一个数组元组总个数为偶数个,另一个为奇数个
if(length%2==1){
int pivot=partion(c,b,e);
int len1=0;
int len2=0;
int xor1=0,xor2=0;
len1=pivot-b+1;
len2=e-pivot;
for(int i=b;i<=pivot;i++){
xor1^=c[i];
}
   for(i=pivot+1;i<=e;i++){
xor2^=c[i];
}
if(len1%2==0){
//①偶数个的数组异或为0,表示其中没有出现次数为奇数个的3个元素中的任何一个
if(xor1==0){
findingOdd(c,pivot+1,e);
}
//偶数个的数组异或不为0,表示其中有出现次数为奇数个的3个元素中的2个
else{
cout<<xor2<<" ";
findingOdd(c,b,pivot);
}}
//与①对称的情况
else if(len2%2==0){
if(xor2==0){
findingOdd(c,b,pivot);
}
else{
cout<<xor1<<" ";
findingOdd(c,pivot+1,e);
}}}
//当数组中存在2个个数为奇数个的数的情况(此时数组总元素个数为偶数)
else{
int len1=0;
int len2=0;
int xor1=0,xor2=0;
   int pivot=partion(c,b,e);
len1=pivot-b+1;
len2=e-pivot;
for(int i=b;i<=pivot;i++){
xor1^=c[i];
}
   for(i=pivot+1;i<=e;i++){
xor2^=c[i];
}
//划分后两个子数组均有奇数个元素,则说明出现奇数个的2个数分别在两个数组中,分别用异或求出
if(len1%2==1){
cout<<xor1<<" "<<xor2<<"  ";
}
//划分后出现奇数个的2个数都在其中一个子数组中
else {
if(xor1!=0)
findingOdd(c,b,pivot);
else 
findingOdd(c,pivot+1,e);
}}}
void main()
{
int arr[15]={14,467,334,334,500,500,14,500,169,467,467,500,500,14,14};
findingOdd(arr,0,14);
cout<<endl;
}


终于将注释添加好了,鼓掌~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值