📜  门| GATE CS Mock 2018 |第 52 题(1)

📅  最后修改于: 2023-12-03 15:28:39.350000             🧑  作者: Mango

GATE CS Mock 2018 | 问题 52

本题给出一个包含 n 个元素的数组,数组中每个元素的取值范围在1到n-1之间。其中某个元素重复了多次,而另外一个元素缺失了。找出这个元素的值。

示例
输入: [4, 2, 1, 4, 3]
输出: 4
算法

我们可以利用数组下标来寻找重复元素。我们遍历数组并将每个元素取反,然后检查数组中哪个元素已经被取反了。这个元素就是重复的元素。

然后我们遍历数组中所有元素,找到某个未被取反的元素。这个元素缺失了。

代码
def find_missing_and_duplicate(arr):
    n = len(arr)
    duplicate = None

    # 找到重复元素
    for i in range(n):
        idx = abs(arr[i]) - 1
        if arr[idx] < 0:
            duplicate = abs(arr[i])
        else:
            arr[idx] = -arr[idx]

    # 找到缺失元素
    missing = None
    for i in range(n):
        if arr[i] > 0:
            missing = i + 1

    return missing, duplicate

# 测试代码
print(find_missing_and_duplicate([4, 2, 1, 4, 3])) # 输出: (5, 4)

在本算法中,我们需要迭代两次。时间复杂度为 O(n)。