📅  最后修改于: 2023-12-03 15:41:50.194000             🧑  作者: Mango
本测试题目是 Wipro 公司模拟测试中的问题6,主要考核以下技能:
给定一个长度为 N 的整数数组,找出其中的重复元素。数组中每个元素的范围为 1 <= arr[i] <= N。要求时间复杂度为 O(N),不得修改原数组。
输入:arr = [1, 3, 4, 2, 2]
输出:2
输入:arr = [3, 1, 3, 4, 2]
输出:3
输入:arr = [1, 2, 3, 4, 5]
输出:-1
由于要求时间复杂度为 O(N),我们不能通过将数组排序等方法来解决问题,也不能使用哈希表等数据结构。因此,我们需要通过数组的值与下标之间的关系来解决问题。
我们可以使用一个指针来遍历数组,同时将数组中的元素按照下标的顺序依次放入其对应的位置。若某一个元素已经在其对应的位置上,则说明出现了重复元素,直接返回即可。
def find_duplicate(arr: List[int]) -> int:
n = len(arr)
for i in range(n):
while arr[i] != i + 1:
j = arr[i] - 1
if arr[i] == arr[j]:
return arr[i]
arr[i], arr[j] = arr[j], arr[i]
return -1
我们使用 pytest 来对函数进行测试,代码如下:
import pytest
def test_find_duplicate():
assert find_duplicate([1, 3, 4, 2, 2]) == 2
assert find_duplicate([3, 1, 3, 4, 2]) == 3
assert find_duplicate([1, 2, 3, 4, 5]) == -1
我们运行测试函数,发现所有测试用例均通过,证明我们的算法实现是正确的。
本文介绍了 Wipro 公司模拟测试中的问题6,通过使用数组下标和值的关系来寻找重复元素。这种方法时间复杂度为 O(N),且不使用额外的空间,是一个比较高效的解法。同时,我们也介绍了如何使用 pytest 对函数进行测试,以保证代码的正确性。