1. 程式人生 > 遊戲攻略 >《原神攻略》魚肉收集路線展示

《原神攻略》魚肉收集路線展示

陣列中重複的數字

題目描述

在一個長度為 n 的數組裡的所有數字都在 0 到 n-1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出陣列中任意一個重複的數字。

Input:
{2, 3, 1, 0, 2, 5}

Output:
2

解題思路

要求時間複雜度 O(N),空間複雜度 O(1)。因此不能使用排序的方法,也不能使用額外的標記陣列。

對於這種陣列元素在 [0, n-1] 範圍內的問題,可以將值為 i 的元素調整到第 i 個位置上進行求解。在調整過程中,如果第 i 位置上已經有一個值為 i 的元素,就可以知道 i 值重複。

以 (2, 3, 1, 0, 2, 5) 為例,遍歷到位置 4 時,該位置上的數為 2,但是第 2 個位置上已經有一個 2 的值了,因此可以知道 2 重複:

程式碼實現

package main

/**
 * 程式碼中的類名、方法名、引數名已經指定,請勿修改,直接返回方法規定的值即可
 *
 * 
 * @param numbers int整型一維陣列 
 * @return int整型
 */

func duplicate( numbers []int ) int {
    if len(numbers) == 0 {
        return -1
    }
    // write code here
    s := make([]int, 0)
    for i := 0;i < len(numbers);i++ {
        s = append(s, -1)
    }
    
    for _, v := range numbers {
        if s[v] != -1 {
            return v
        }
        s[v] = v
    }
    
    return 0
}