2017-01-30 6 views
3

N個のコインを一列に並べて表示することを検討してください。各コインには頭か尾が見えます。これらのコインの隣接は、同じ面を示すコインの隣接する対の数である。コインを表すN個の整数からなる空でないゼロインデックス配列Aが与えられた場合、正確に1つのコインを逆転することによって得られる可能性のある最大の隣接関係を返す(すなわち、コインの1つを逆転させる必要がある)。配列Aの連続する要素は、行内の連続したコインを表します。配列Aには0と1だけが含まれます。 *たとえば、配列Aは6つの数字からなり、次のようになります。 * A [0] = 1 * A [1] = 1 * A [2] = 0 * A [3] = 1 * A [4] = 0 * A [5] = 0 * *関数は4を返します。隣接する2つのコインが同じすなわち、(0,1)および(4,5)である。 (0,1)、(1,2)、(2,3)、(4)の4つの隣接コインが存在するので、A [2]で表されるコインを反転させた後、 5)、より高い隣接性を得ることは不可能である。コインシーケンスのコードをデバッグ

public static int solution3(int[] A) { 
    int n = A.length; 
    int result = 0; 
    for (int i = 0; i < n - 1; i++) { 
     if (A[i] == A[i + 1]) 
      result = result + 1; 
    } 
    int r = 0; 
    for (int i = 0; i < n; i++) { 
     int count = 0; 
     if (i >0) { 
      if (A[i - 1] != A[i]) 
       count = count + 1; 
      else 
       count = count - 1; 
     } 
     if (i < n - 1) { 
      if (A[i + 1] != A[i]) 
       count = count + 1; 
      else 
       count = count - 1; 
     } 
     r = Math.max(r, count); 
    } 
    return result + r; 
} 

コードの[最大3行は、必要な答えを得るために変更する必要があります!

答えて

4

与えられるように、関数は、コイン反転(可変結果)及び逆転(可変R)後関与変更前の対の和として結果を算出します。

次の実装:

int r = 0; 
... 
r = Math.max(r, count); 

が変化(可変R)が間違っている、常に非負であると仮定します。タスクの説明では、コインの逆戻りは必須ですが、オプションではありません(私の最初の読書では無視したことです)。これに基づいて、場合によってはコインの逆転(例えば列[0,0,0]のコイン)は、対の少なくとも1つを消滅させる(負の変化、すなわち変数の負の値を意味する)。)。負の変更を許可する最も簡単な方法は、変数の初期値をrから-1に設定することです。これは最悪の場合に最適なソリューションを選択する際に可能な最小値です(ペアを "壊す" )。 -2の値も可能です(最良の解を選んでいない場合は2つのペアを壊す)が、常に1つのペアを破棄するオプションがあるので、このケースは無視することができます。結果。だから私が何かが欠落していない限り、修正はちょうど1行の変更から成っています:

int r = 0;

のint R = -1

関連する問題