1. 题目解析与需求拆解
这道题目要求我们实现一个有序顺序表的重复元素删除操作。首先需要明确几个关键概念:
- 顺序表:采用顺序存储结构的线性表,元素在内存中连续存放
- 有序:表中元素已按某种规则(如升序或降序)排列
- 删除重复元素:保留每个值第一次出现的位置,删除后续出现的相同值
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法设计思路
对于有序顺序表,重复元素必定相邻排列。这个特性可以大幅简化算法设计:
2.1 双指针法
- 初始化两个指针:i=0(慢指针),j=1(快指针)
- 遍历顺序表:
- 当L.data[j] ≠ L.data[i]时,将L.data[j]复制到i+1位置
- 否则j继续向后移动
- 最后修改表长为i+1
2.2 时间复杂度分析
- 最好情况:O(1)(无重复元素)
- 最坏情况:O(n)(全部为重复元素)
- 平均情况:O(n)
3. 具体实现代码(C语言)
c复制void DeleteDuplicate(SqList *L) {
if (L->length == 0) return; // 空表直接返回
int i = 0; // 慢指针
for (int j = 1; j < L->length; j++) { // 快指针
if (L->data[j] != L->data[i]) {
L->data[++i] = L->data[j];
}
}
L->length = i + 1; // 更新表长
}
4. 边界条件处理
需要特别注意以下几种特殊情况:
- 空表处理:直接返回
- 单元素表:无需处理
- 全相同元素:保留第一个
- 无重复元素:保持原样
5. 算法优化建议
- 空间优化:原地算法,空间复杂度O(1)
- 提前终止:当j遍历完所有元素后即可终止
- 稳定性:保持非重复元素的原始相对顺序
6. 测试用例设计
建议测试以下场景:
c复制// 测试用例1:普通情况
{1,2,2,3,3,3,4,5,5} → {1,2,3,4,5}
// 测试用例2:全相同元素
{7,7,7} → {7}
// 测试用例3:无重复元素
{1,3,5} → {1,3,5}
// 测试用例4:空表
{} → {}
7. 复杂度对比
与其他方法对比:
- 暴力法:O(n²)(每个元素与后面所有元素比较)
- 哈希表法:O(n)但需要额外空间
- 排序+去重:破坏原始顺序
8. 实际应用场景
这种算法常用于:
- 数据库查询结果去重
- 日志数据清洗
- 统计分析的预处理
- 数据仓库ETL过程
9. 扩展思考
如果题目改为无序顺序表:
- 可以先排序再使用本算法(O(nlogn))
- 使用哈希表记录已出现元素(O(n)但需要额外空间)
提示:在面试中,面试官可能会追问无序情况的处理,建议提前准备相关解法。
