タイトル説明
長さ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;
}
}