方法1:
public boolean duplicate(int numbers[],int length,int [] duplication) {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0;i<length;i++) {
if (list.contains(numbers[i])) {
duplication[0] = numbers[i];
return true;
}else {
list.add(numbers[i]);
}
}
return false;
}
方法2:
配列内の各数値が配列の長さよりも短いことがわかっているので、配列内に繰り返し数値がない場合は、配列を小さいものから大きいものに並べ替えて、i-に対応する要素値を満たす必要があります。 thの位置はiです。この機能を使用します(配列{2、3、1、0、2、5、3}、ポインター '|'):
| 2 3 1 0 2
53このときのポインタ '|'の位置は0で、配列の位置0の要素の値は2、2!= 0であり、位置0と位置の要素を交換します。配列内の2。
| 1 3 2 0 2
53ポインタ '|'の位置はまだ0であり、配列の位置0の要素の値は1、1!= 0であり、位置0と位置1の要素を交換します。配列。
| 3 1 2 0 2
53ポインタ '|'の位置はまだ0であり、配列の位置0の要素の値は3、3!= 0であり、位置0と位置3の要素を交換します。配列。
| 0 1 2 3 2 5 3
ポインタ '|'の位置はまだ0ですが、配列の位置0にある要素の値は0、0 == 0であり、ポインタ '|'は1ビット移動します右の方へ。
0 | 1 2 3 2
53このときのポインタ '|'の位置は1ですが、配列内の位置1の要素の値は1であり、1 == 1です。ポインタ '|'を1つ移動します。少し右に。
0 1 | 2 3 2
53このときのポインタ「|」の位置は2ですが、配列の位置2の要素の値は2、2 == 2であり、ポインタ「|」が移動します。右に1ビット。
0 1 2 | 3 2
53このときのポインタ '|'の位置は3ですが、配列内の位置3の要素の値は3であり、3 == 3です。ポインタ '|'を1つ移動します。少し右に。
0 1 2 3 | 2
53このときのポインタ '|'の位置は4、配列の位置4の要素の値は2、2!= 4、位置の要素の値は4と配列の位置2が等しい場合、この要素の値を出力します。
public boolean duplicate2(int numbers[],int length,int [] duplication) {
if (numbers == null||numbers.length == 0) {
return false;
}
for (int i = 0;i<length;i++) {
while (numbers[i] != i) {
if (numbers[i] == numbers[numbers[i]]) {
duplication[0] = numbers[i];
return true;
}
int tmp = numbers[i];
numbers[i] = numbers[tmp];
numbers[tmp] = tmp;
}
}
return false;
}