Python:如何找出数组中唯一重复的元素

本文介绍了五种在Python中找出数组中唯一重复元素的算法:1.使用Hash法(字典法),2.累加求和法,3.或异法,4.数据映射法,5.环形相遇法。这些方法分别具有不同的时间复杂度和空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.Hash法(字典法):空间换时间

def findDup(array):
    if array == None:
        return -1
    lens = len(array)
    hashTable = dict()
    i = 0
    while i<lens-1 :
        hashTable[i] = 0
        i += 1
    j = 0
    while j<lens :
        if hashTable[array[j]-1] == 0 :
            hashTable[array[j]-1] = array[j]
        else:
            return array[j]
        j += 1
    return -1

if __name__ == '__main__':
    array = [1, 3, 2, 1, 5, 4]
    print(findDup(array))
    

时间和空间复杂度都是O(n)

2.累加求和法

def findDup(array):
    if array == None:
        return -1
    suma = sum(array)
    lens = len(array)
    sumb = (lens-1)*lens/2
    return int(suma - sumb)

if __name__ == '__main__':
    array = [1, 3, 2, 1, 5, 4]
    print(findDup(array))

时间复杂度O(n),空间复杂度O(1)

3.或异法

def findDup(array):
    if array == None:
        return -1
    lens = len(array)
    result = 0
    i = 0
    while i<lens :
        result ^= array[i]
        i += 1
    j = 1
    while j<lens :
        result ^= j
        j += 1
    return result

if __name__ == '__main__':
    array = [1, 3, 2, 1, 5, 4]
    print(findDup(array))
    

时间复杂度O(n),空间复杂度为0

4.数据映射法

def findDup(array):
    if array == None :
        return -1
    lens = len(array)
    i = 0
    while True:
        if array[i]>=lens :
            return -1
        if array[i]<0 :
            break
        array[i] *= -1
        i = -1*array[i]
    return i

时间复杂度O(n),空间复杂度为0

5.环形相遇法

def findDup(array):
    if array == None :
        return -1
    slow = 0
    fast = 0
    while True :
        fast = array[array[fast]]
        slow = array[slow]
        if fast == slow :
            break
    fast = 0
    while True :
        fast = array[fast]
        slow = array[slow]
        if fast == slow :
            return slow
### Python 实现列表或数组去重 在 Python 中,有多种方式可以实现列表或数组的去重操作。以下是几种常见的方法: #### 方法一:利用集合 `set` 去重 集合是一种无序的数据结构,不允许存在重复元素。因此可以直接将列表转换为集合再转回列表来完成去重。 ```python def remove_duplicates_set(lst): return list(set(lst)) lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 6, 9] result = remove_duplicates_set(lst) print(result) # 输出可能不保持顺序,因为 set 是无序的 ``` 这种方法虽然简洁高效,但由于集合本身是无序的,可能会改变原列表中的元素顺序[^1]。 --- #### 方法二:手动遍历并检查是否存在 此方法通过创建一个新的空列表,并逐一检查原列表中的每个元素是否已经存在于新列表中。如果没有,则将其加入新列表。 ```python def remove_duplicates_manual(lst): unique_list = [] for item in lst: if item not in unique_list: unique_list.append(item) return unique_list lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 6, 9] result = remove_duplicates_manual(lst) print(result) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ``` 该方法能够保留原有列表中元素的顺序,但时间复杂度较高,适用于较小规模数据集。 --- #### 方法三:使用字典键唯一性特性 由于字典的键具有唯一性,可以通过构造临时字典的方式来快速去除重复项。 ```python def remove_duplicates_dict(lst): dict_temp = {} for item in lst: dict_temp[item] = None return list(dict_temp.keys()) lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 3, 5, 6, 9] result = remove_duplicates_dict(lst) print(result) # 输出: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] ``` 这种方式效率高且能较好地保留原始顺序,在较大数据集中表现优异[^3]。 --- #### 方法四:针对二维数组的去重 对于二维数组的情况,普通的 `set` 或其他方法无法直接应用,需借助 NumPy 的 `unique` 函数或其他高级技巧。 ```python import numpy as np def remove_duplicates_2d(array): array_unique = np.unique(np.array(array), axis=0) return array_unique.tolist() array = [(1, 2), (3, 4), (5, 6), (7, 8), (7, 8), (3, 4), (1, 2)] result = remove_duplicates_2d(array) print(result) # 输出: [[1, 2], [3, 4], [5, 6], [7, 8]] ``` 注意,NumPy 提供的 `unique` 函数支持多维数组的操作,但在某些情况下仍需额外处理才能满足特定需求[^5]。 --- ### 性能比较与适用场景分析 - **小型数据集**:推荐使用方法二(手动遍历),因为它逻辑清晰易懂。 - **大型数据集**:建议采用方法三(基于字典)或方法一(基于集合),它们的时间复杂度较低。 - **特殊结构数据**:如二维数组或多层嵌套对象,应优先考虑专门库的支持功能,例如 NumPy 的 `unique` 函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值