[配列]配列内の繰り返し番号

タイトル説明

長さnの配列内のすべての数値は、0からn-1の範囲です。配列内のいくつかの数字が繰り返されていますが、いくつの数字が繰り返されているのかわかりません。それぞれの数字が何回繰り返されるかわかりません。配列の最初の繰り返し番号を見つけてください。たとえば、入力の長さが7配列{2,3,1,0,2,5,3}の場合、対応する出力は最初に繰り返される数値2です。
戻り値の説明:
配列に重複する数値がある場合、関数はtrueを返し、そうでない場合はfalseを返します。
配列に重複する番号がある場合は、重複する番号をパラメーターduplication [0]に入れます。(Ps:duplicationは初期化されており、直接割り当てて使用できます。)


ハッシュ

考えられる最も簡単なことは、アクセスされた番号を格納するためにハッシュテーブルを使用することです。アクセスされた番号に遭遇した場合は、直接戻ることができます。コードは非常に単純です。

最適化されたソリューション

ハッシュ法の使用は、タイトルで与えられた情報を完全には使用しません。すべての数値は0からn-1の範囲ですすべての数値は0〜n-1の範囲内にあるため、配列をトラバースするときに、この位置の値を添え字として使用し、配列の対応する添え字の値にnを追加できます。同じ数値に再度アクセスすると、対応するターゲットの値はすでにnより大きいため、その数は繰り返し数であると判断できます。

public class Solution {
    
    
    public boolean duplicate(int numbers[],int length,int [] duplication) {
    
    
        boolean isDuplicate = false;
        if (numbers == null)
            return isDuplicate;
        for (int i = 0; i < length; i++) {
    
    
            int index = numbers[i]; // 获取对应的下标
			// 获取真正的下标值,以防它是被加过length的,防止越界
            if (index >= length) 
                index -= length;
            if (numbers[index] >= length) {
    
    
                isDuplicate = true;
                duplication[0] = index;
                break;
            }
            numbers[index] += length;
        }
        return isDuplicate;
    }
}

おすすめ

転載: blog.csdn.net/weixin_43486780/article/details/113784186