Icoding题解 线性表 删除重复
题干
顺序表 删除重复
编写算法,在一非递减的顺序表L中,删除所有值相等的多余元素。要求时间复杂度为O(n),空间复杂度为O(1)。
函数原型如下:
void del_dupnum(SeqList *L)
相关定义如下:
1 2 3 4 5
| struct _seqlist{ ElemType elem[MAXSIZE]; int last; }; typedef struct _seqlist SeqList;
|
分析
简要分析题干:
这压根就不需要分析……
应当注意的问题:
- 时间复杂度和空间复杂度的要求
- 删除值相等的元素,考虑到有多个数字可能会产生重复
- 数组是非递减的(重要!)
解题思路:
- 分析题目易得,只能有一个循环(实际上存在有内外两层循环、但时间复杂度仍然为O(n)的情况,但是icoding的判定不太聪明,它只要看到两层循环就直接判不通过了)
- 同时,不能另外开辟一个数组,仅能对原本提供的数组进行操作。
- 数组是非递减的,换言之,只要跳过重复的数字即可,不重复的数字一一复制即可。
核心代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| void del_dupnum(SeqList *L) { int PrevIndex = 0; int NewIndex = 0;
while (PrevIndex <= L->last) { if (L->elem[PrevIndex] == L->elem[NewIndex]) { PrevIndex++; } else { NewIndex++; L->elem[NewIndex] = L->elem[PrevIndex]; PrevIndex++; } } }
|
完整代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| void del_dupnum(SeqList *L) { int prev = 0; int curr = 0; while (curr <= L->last){ if (L->elem[curr] == L->elem[prev]){ curr += 1; } else{ prev += 1; L->elem[prev] = L->elem[curr]; curr += 1; } } L->last = prev; }
|