问题描述:从有序顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。
方法一:用k记录顺序表a中不重复的元素的个数,用temp记录不重复的元素。在遍历过程中让每个元素与temp比较,若该元素与temp不同则统计k的个数并将该不重复的元素向前放置在k位置上,若相同则是重复元素则继续向后判断,直至判断到表尾为止。
void delRept_1(int *a, int &n)
{
int k = 1; //默认第0个元素是不重复的,故k的初值为1
int temp = a[0];
for(int i = 1; i < n; ++i)
{
if(a[i] != temp)
{
temp = a[i]; //给temp赋值不重复的元素值
a[k] = a[i];
++k;
}
}
n = k; //修改顺序表a的长度
}
方法二:因为是有序顺序表,值相同的元素一定在连续的位置上,用类似于直接插入排序的思想,初始时将第一个元素看作非重复的有序表。之后以此判断后面的元素是否与前面非重复有序表的最后一个元素相同,如果相同则继续向后判断,如果不同则插入到前面的非重复有序表的最后,直至判断到表尾为止。
void delRept_2(int *a, int &n)
{
int i, j;
for(i = 0, j = 1; j < n; ++j)
if(a[i] != a[j])
a[++i] = a[j];
n = i + 1;
}