📜  资质| Wipro模拟测试|问题6(1)

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

Wipro 模拟测试 - 问题6

本测试题目是 Wipro 公司模拟测试中的问题6,主要考核以下技能:

  • 代码逻辑思维
  • 数组操作
  • 循环控制
题目描述

给定一个长度为 N 的整数数组,找出其中的重复元素。数组中每个元素的范围为 1 <= arr[i] <= N。要求时间复杂度为 O(N),不得修改原数组。

输入
  • arr - 长度为 N 的整数数组
输出
  • 重复元素 - 若存在重复元素,则输出其中一个即可;若无重复元素,则输出 -1。
示例
示例1

输入:arr = [1, 3, 4, 2, 2]
输出:2

示例2

输入:arr = [3, 1, 3, 4, 2]
输出:3

示例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 对函数进行测试,以保证代码的正确性。