void findodd(int a[])
{
int hash[100];
int i;
int c[100]={0};
for(i=0;i<6;i++)
{
c[a[i]]=c[a[i]]+1;
hash[a[i]]=c[a[i]];
if(c[a[i]]%2==0)
hash[a[i]]=0;
}
for(i=0;i<6;i++)
if(hash[a[i]]!=0)
cout<<a[i];
}
int main()
{
int a[] = {1,3,3,5,5,5};
findodd(a);
return 0;
}
该程序用于查找数组中出现奇数次数的整数。以下是上述计划的link。
答案 0 :(得分:2)
鉴于您的算法已在O(n)上运行,我假设您要删除输出中的重复条目。一种可能的解决方案是:
void findodd(int a[])
{
int hash[100];
int i;
int c[100]={0};
int hashdup[100];
memset(hashdup, 0, sizeof(int)*100);
for(i=0;i<6;i++)
{
c[a[i]]=c[a[i]]+1;
hash[a[i]]=c[a[i]];
if(c[a[i]]%2==0)
hash[a[i]]=0;
}
for(i=0;i<6;i++)
{
if(hash[a[i]]!=0)
hashdup[a[i]]++;
if (hashdup[a[i]]==1)
cout<<a[i];
}
}
答案 1 :(得分:1)
#include <iostream>
void find_odd(int a[])
{
int hash[101] = { 0 };
int i;
for( i = 0 ; i < 6 ; i++ )
{
hash[ a[i] ]++;
}
for(i=0 ; i<100 ; i++)
if(hash[i] != 0 && !(hash[i] % 2 == 0))
std::cout << i << std::endl;
}
int main()
{
int a[] = {1,3,3,5,5,5};
find_odd(a);
return 0;
}
但您可能更善于使用std::vector
和/或std::map
。
使用底片:但仅在-100范围内 - > +100。你不能有一个负数组索引,所以只需要+100
,并且{0}的数组为hash
。
#include <iostream>
void find_odd(int a[])
{
int hash[201] = { 0 };
int i;
for( i = 0 ; i < 9 ; i++ )
{
hash[ a[i]+100 ]++;
}
for(i=0 ; i<201 ; i++)
if(hash[i] != 0 && !(hash[i] % 2 == 0))
std::cout << i-100 << std::endl;
}
int main()
{
int a[] = {-1 , -1 , -1 , 1 , 3 , 3 , 5 , 5 , 5};
find_odd(a);
return 0;
}
使用std::vector
和std::map
(适用于正数和负数)
#include <iostream>
#include <map>
#include <vector>
void find_odd_mapped(std::vector<int>& a)
{
std::map<int , int> hash;
std::map<int , int>::iterator map_iter;
std::vector<int>::iterator vec_iter;
for( vec_iter = a.begin() ; vec_iter != a.end() ; ++vec_iter )
++hash[*vec_iter];
for(map_iter = hash.begin() ; map_iter != hash.end() ; ++map_iter)
if(!((*map_iter).second % 2 == 0))
std::cout << (*map_iter).first << std::endl;
}
int main()
{
std::vector<int> a;
a.push_back(-1);
a.push_back(-1);
a.push_back(-1);
a.push_back(1);
a.push_back(3);
a.push_back(3);
a.push_back(5);
a.push_back(5);
a.push_back(5);
find_odd_mapped(a);
return 0;
}
答案 2 :(得分:0)
唯一的一点是,如果你知道你的参赛作品的边界,如果有一个有限的输入类型,那么上面的所有代码都可以工作,但如果你不知道边界或边界太高(对于例如,你有一个整数范围的条目)然后即使最好的算法使用O(nlogn)来删除dublicate条目。