私は次のようなハッカーランクの問題に取り組んでいます:
問題は、包括的範囲[L、R]を見つけることです配列が降順で並べ替えられたときに、並べ替えられた範囲内の最初の2つの要素に対してAND演算を実行すると、そのようなすべての可能な結果の最大値が得られます。関数は、2つの整数の配列を返す必要があります。インデックス0には配列のL "のインデックスに対応する整数が含まれ、インデックス1には配列のR"のインデックスに対応する整数が含まれます。
有効な回答が1つ以上ある場合は、L値が最も低いものを選択します。 2つ以上の有効な回答のL値が同じ場合、最短の範囲にまたがる回答を選択します。
例array = {6,3,6}
出力は0,2である必要があります
説明:ソートされたときに{6,6,3}になる{6,6,3}になる範囲[0,2]について。次に、AND演算6&6により、可能な限り最大の答えが得られます。したがって、結果は[0,2]になります。
私はこの問題を試してみましたが、以下の答えがありました:
static int[] process(int[] array) {
int max=0;
List<Integer[]> list = new ArrayList<>();
Integer[] index = new Integer[2];
for (int i = 0; i < array.length; i++) {
for(int j =i+1 ; j <= array.length -1 ; j++){
int z = array[i] & array[j];
if(z > max){
max=z;
index[0] = i;
index[1] = j;
list.add(index);
}
}
}
int[] result = new int[2];
result[0] = index[0];
result[1] = index[1];
int least = result[0] - result[1];
for(int i=1; i< list.size(); i++) {
Integer[] data = list.get(i);
int temp = index[0] - index[1];
if(temp < least) {
least = temp;
result[0] = index[0];
result[1] = index[1];
}
}
return result;
}
このプログラムは、一部のテストケースのみに合格しています。このプログラムの問題を把握することはできません。私を助けてください。
回答:
回答№1は1コードは、2つの値のすべての組み合わせをANDして、最大値を見つけます。 間違って そのような最大のコンボは、その間の範囲で2つの最大値を選択する必要がある場合、変更されないままになると結論付けます。
例えば。入力用 6,2,8,6
、あなたはそれを結論付けた 6&6
= 6
が最大で、答えは [0,3]
=> 8,6,6,2
=> 8&6
= 0
(おっとっと!)、while [0,1]
=> 6,2
=> 6&2
= 2
正しい答えです。
ロジックの前提に欠陥があります。もう一度考え直してください。