1. 题目解析与基础解法
这道题目看似简单,但蕴含着算法设计的多个关键考量点。题目要求处理N个1到500之间的随机整数,完成去重和排序两个核心操作。我们先从最直观的Python解法开始分析。
1.1 问题重述与输入输出分析
给定N个范围在[1,500]的整数,需要:
- 去除所有重复的数字
- 将剩余的唯一数字按升序排列
- 输出最终结果
输入示例:
code复制[3, 2, 2, 1, 5, 4]
输出示例:
code复制[1, 2, 3, 4, 5]
1.2 Python基础解法
最直接的Python实现方式是利用集合(set)的去重特性和sorted()函数的排序能力:
python复制def basic_solution(numbers):
unique_numbers = list(set(numbers))
return sorted(unique_numbers)
这个解法虽然简洁,但存在几个值得注意的问题:
- 使用set去重会丢失原始顺序(虽然题目不要求保持原始顺序)
- 对去重后的结果调用sorted()会产生新的列表对象
- 整体时间复杂度为O(n log n),主要来自排序操作
注意:在实际面试中,即使给出这种解法,也应该主动指出这些潜在问题,展示你的思考深度。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 算法优化与性能分析
2.1 计数排序的应用
由于题目明确数字范围在1到500之间,这个有限的范围提示我们可以使用计数排序(Counting Sort)来获得更好的时间复杂度:
python复制def counting_sort_solution(numbers):
count = [0] * 501 # 因为数字范围是1-500
for num in numbers:
count[num] += 1
return [i for i in range(1, 501) if count[i] > 0]
这种解法的时间复杂度是O(n),因为:
- 初始化计数数组:O(1)(固定500长度)
- 统计数字出现次数:O(n)
- 生成结果数组:O(1)(固定500次检查)
空间复杂度是O(1),因为使用了固定大小的计数数组。
2.2 不同规模数据的处理策略
虽然计数排序在本题限制下表现优异,但我们需要思考更一般化的情况:
- 数字范围扩大:如果范围变为1到10^6,计数排序仍然可行,但会消耗更多内存
- 数据量极大:如果N非常大(如10^9),即使是O(n)算法也可能不够高效
- 流式数据:如果数据是实时输入的流,需要设计增量处理方案
针对这些情况,可以考虑:
- 使用堆排序(Heap Sort)处理大规模数据
- 布隆过滤器(Bloom Filter)处理流式去重
- 分治策略处理
