在面试某大厂的时候遇到一个笔试题目,题目内容为:给定一个列表,去除重复的数字(自身也不保留),例如 [1, 2, 2, 3, 4],处理后为 [1, 3, 4]。
用例输入:nums = [1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7]
用例输出:nums = [1, 2, 5, 7]
看到题目的想到一种解法就是对每一个数字进行计数,最后只留出现次数为1的数字。但是这种方法的算法复杂度很好,在面试的时候并没有提到,在整理的时候梳理一下。
nums = [1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7]
count_nums = [nums.count(i) for i in nums]
res_nums = []
for i in range(len(nums)):
if count_nums[i] == 1:
res_nums.append(nums[i])
这道题目可以利用哈希查找进行解题,有点类似两数求和,具体流程为:
评价:这种方法适用于无序数组,可以自行更新尝试。
nums = [1, 2, 3, 3, 3, 4, 4, 5, 6, 6, 7]
rep_nums = []
res_nums = []
for i in nums:
# 首先判断是否在重复数组中,若存在直接break
if i in rep_nums:
continue
# 其次判断是否在结果数组中,若存在则从结果数组中移除并在重复数组中添加
if i in res_nums:
res_nums.remove(i)
rep_nums.append(i)
else:
res_nums.append(i)
print(res_nums)
变体:如果说明给定数组为有序,可以有一些更为奇妙的方法。