📌  相关文章
📜  教资会网络 | UGC-NET CS 2017 年 12 月 2 日 |问题 26(1)

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

教资会网络 | UGC-NET CS 2017 年 12 月 2 日 |问题 26

这是一道关于计算机科学的问题,要求程序员实现一个算法。

问题描述

有一个长度为 n 的未排序的整数数组,其中每个元素的值都在 1 到 n 之间。你需要找到一个重复的元素,使得它出现了至少两次,并且要求它是数组中出现最早的重复元素。

输入

输入包含一个整数数组,数组长度不超过 10^6

输出

输出一个整数,表示第一个出现的重复元素的值,如果没有重复元素,输出 -1

实现

程序员可以通过以下方式实现该算法:

public int firstDuplicate(int[] nums) {
    int[] freq = new int[nums.length];
    for (int num : nums) {
        if (freq[num - 1] == 1)
            return num;
        freq[num - 1]++;
    }
    return -1;
}

该算法通过一个长度为 n 的数组 freq 记录每个数字出现的次数。遍历数组 nums,如果该数字已经出现过一次,则返回该数字;否则将该数字在 freq 数组中的计数加一。如果遍历完数组后没有返回,说明数组中没有重复元素,返回 -1。

示例

以下是该算法的示例输入和输出:

输入
int[] nums = {2, 1, 3, 5, 3, 2};
输出
3
输入
int[] nums = {1, 2, 3, 4, 5};
输出
-1
算法分析

该算法的时间复杂度为 O(n),空间复杂度为 O(n),其中 n 是数组的长度。该算法的思路非常简单,效率也比较高,因此可以适用于大多数情况下需要找到重复元素的场合。