python面试题:删除有序数组中的重复项
在日常开发里,处理“有序数组中的重复项”其实是个非常常见的需求。尤其是你在做数据清洗、去重处理,或者准备数据用于算法分析的时候,保持数组的唯一性往往是第一步。而对于一个 Python 开发来说,掌握这类操作,思路清晰比“写花里胡哨的代码”更重要。
场景一般是这样的:你拿到一个已经排好序的数组,需要原地删除重复元素,保证每个元素只出现一次,同时返回“有效长度”。所谓原地,其实就意味着你不能开辟新的数组,只能在原数组上操作。
说到这儿,你可能第一个想到的是用 set 去重,确实,set(nums) 一行代码直接解决问题,但——题设说的是“有序数组”,还要“原地”处理,这时候用 set 就不合适了,原因很简单:set 是无序的,直接打乱了原数组顺序,还开了额外的内存。
所以更正统、更合理的解法是——双指针。
我们用一个慢指针 i 标记去重后数组的尾部,一个快指针 j 向前扫描,如果当前元素和 i 所指的不同,就说明是一个新元素,可以覆盖 i+1 的位置。
代码写出来就很清晰:
defremove_duplicates(nums):
ifnot nums:
return0 i = 0# 慢指针
for j in range(1, len(nums)):
if nums[j] != nums[i]:
i += 1
nums[i] = nums[j]
return i + 1# 返回新的长度
举个例子,nums = [1, 1, 2, 2, 3],运行后 nums 会变成 [1, 2, 3, 2, 3],前三位就是我们要的结果,而返回值 3 就是“去重后数组的有效长度”。这正是题目要求的——原地处理,保持顺序,不额外开空间。
从复杂度角度看,这个方法的时间是 O(n),空间是 O(1),完全满足面试中“原地、低复杂度”的要求。如果你写出来了 set 去重,可能会被考官追问“那还要数组有序干嘛?”。这时候能立马切换到双指针思路,才是真技术过硬。
说到底,面试时你写出一个能跑的代码只是起点,理解它为什么这么写,复杂度在哪儿,适用于什么场景,才是让人觉得你“靠谱”的关键。哪怕是一道看起来很简单的“删除重复项”,背后也有不少坑点值得你琢磨。
最后,我为大家打造了一份deepseek的入门到精通教程,完全免费:https://www.songshuhezi.com/deepseek
也可以看我写的这篇文章《DeepSeek满血复活,直接起飞!》来进行本地搭建。
对编程、职场感兴趣的同学,大家可以联系我微信:golang404,拉你进入“程序员交流群”。
虎哥作为一名老码农,整理了全网最全《python高级架构师资料合集》。