一、查找专题讨论
1.题目一
a.实现:
定义一个容器结构体,结构体中含三个整数数组,一个保存出现的正数元素次数,一个保存出现的负数元素次数,还有一个保存出现的元素;两个整数保存存放的元素个数。
结构体:
typedef struct{
int element[MAXNUM];//保存出现的元素
int judgePos[MAXNUM]={0};//保存每个非负数元素出现的次数,判断是否相同的元素只有一个
int judgeNeg[MAXNUM]={0};//保存每个负数元素出现的次数,判断是否相同的元素只有一个
int countPos=0,countNeg=0;//一个保存非负数的元素个数,一个保存负数的元素个数
}muster;
判断并存放元素:
int insert(muster &S,int i)
{
int count=S.countPos+S.countNeg;
if(i<0)//判断整数正负
{
i=-i;
if(S.judgeNeg[i]!=0)//判断是否该元素是否有出现过
return 0;
S.element[count]=-i;//将该元素存入数组中
S.judgeNeg[i]++;//负数元素数组记录出现次数
S.countNeg++;//负数元素个数增加
}
else
{
if(S.judgePos[i]!=0)
return 0;
S.element[count]=i;
S.judgePos[i]++;
S.countPos++;
}
return 1;
}
所以判断元素唯一性的时间复杂度为O(1);
因为不是进行插入操作,所以只是比较其统计数是否为1。
判断元素唯一性:
int judge(muster S, int i)
{
if (i < 0)
{
i = -i;
if (S.judgeNeg[i] != 1)//通过判断统计数来进行判断
return 0;
else
return 1;
}
else
{
if (S.judgePos[i] != 1)
return 0;
else
return 1;
}
}
b.取出容器中的元素
void PrintfElement(muster S)
{
int count = S.countNeg + S.countPos;
for (int i = 0; i < count; i++)
{
cout << S.element[i] << " ";
}
}
c.按值大小排序输出
void OrderPrinf(muster S)
{
int i, n1,n2;
if (S.countNeg != 0)//判读有无负数元素
{
for (i = 0, n1 = MAXNUM; i < S.countNeg; n1--)//将所有元素遍历,如果存在,则输出
{
if (S.judgeNeg[n1] == 1)
{
n2 = -n1;//因为n1还要进行循环,所以用n2来输出
cout << n2 << " ";
S.countNeg--;//通过输出数的个数与统计保存的元素个数是否相同来看做循环条件
}
}
}
if (S.countPos != 0)//判断有无正数元素
{
for (i = 0, n1 = 0; i < S.countPos; n1++)
{
if (S.judgePos[n1]== 1)
{
cout << n1 << " ";
S.countPos--;
}
}
}
}
·需要这样的容器的原因:因为这样的容器可以保存数据且保证没有相同的元素;
·作用:统计多种重复数据中的所含的元素种类与个数,或是在多种重复元素分配的题目中比较所出现的元素种类是否符合要求(例图着色问题)等。
d.时间复杂度
·插入元素:O(1);
·取出所有元素:O(n);
·删除单个元素:O(1);
void Delete(muster& S, int i)
{
if (i<0)
{
i = -i;
S.judgeNeg[i] = 0;
S.countNeg--;
}
else
{
S.judgePos[i] = 0;
S.countPos--;
}
}
因为判断是根据judge数组里的值进行的,所以只改变judge数组里的即可。
进阶:
定义的结构体中包含五个整数数组与一个字符数组,三个整数。
typedef struct
{
int elementInt[MAXNUM];//保存出现的整数
int judgePos[MAXNUM] = { 0 };//保存每个非负数元素出现的次数,判断是否相同的元素只有一个
int judgeNeg[MAXNUM] = { 0 };//保存每个负数元素出现的次数,判断是否相同的元素只有一个
char elementChar[MAXNUM];//保存出现的字符
int judgeChar[MAXNUM] = { 0 };//根据ASCII码,判断是否相同的字符只有一个
int countPos = 0, countNeg = 0, countChar = 0;
}MulMuster;