2012-05-05 17 views
-2

問題を解決するために次のコードを書きましたが、動作しません。質問へのリンクはhereです。配列論理エラー

public boolean linearIn(int[] outer, int[] inner) { 

    boolean result = false; 

     if(inner.length == 0) 
      return true; 

     index: for(int x: inner) { 
        for(int y: outer) { 
         if(x==y) { 
          result = true; 
          break; 
         } 
         else { 
          result = false; 
          break index; 
         } 
        } 
       } 
     return result; 
    } 
+1

「機能しません」とは何も説明しません。このコードが何をすべきか、それが何をしているのかは正確には説明できません。 – Mat

+0

A)解決しようとしている問題は何ですか? B)期待される結果は何ですか? C)代わりに何を見てるの? D)あなたは何が間違っているかも考えていますか?質問は**自己完結型でなければなりません**。リンクはうまくいきますが、質問に答えるためには、*オプション*にする必要があります。理由:http://meta.stackexchange.com/questions/118392/add-stack-overfow-faq-entry-or-similar-for-putting-code-in-thequestion(同じ原則は、コードリンク)。 –

+0

質問へのリンクは[** here **](http://codingbat.com/prob/p134022) –

答えて

4

問題は他の部分にあります。

if(x==y) { 
result = true; // ele present. 
break; 
} else { 
result = false; // can't conclude ele is absent..you might find it later. 
break index; 
} 

あなたが行う可能性があります。この問題を解決するには:あなたは、内側の配列ではないの要素がちょうど1つの比較がを失敗した場合と結論づけることはできないとして

public boolean linearIn(int[] outer, int[] inner) { 

     for(int x: inner) { 
       // assume x is absent. 
       boolean result = false; 
       for(int y: outer) { 
         // x found in outer. 
         if(x==y) { 
           // make result positive. 
           result = true; 
           // no need to look any further. 
           break; 
         } 
       } 
       // at this point not all elements of inner are 
       // tested for presence in outer. But one missing ele 
       // would mean we return false. 
       if(result == false) return false; 
     } 
     // all ele of inner are present in outer..return true. 
     return true; 
} 
+0

ありがとう@codaddict –

0

あなたはしなければなりませんO(n)解では、あなたはO(n )です。あなただけの3行を必要とする(OK、少し浮気):

int j = 0; 
for (int in : inner) while (outer[j] != in) if (++j == outer.length) return false; 
return true; 
1

を複雑さはO(n)は、仮想的なコードである必要がある場合:

public boolean linearIn (int[] outer, int[] inner) { 

int in=0; 
    for(int i :outer){ 
     if(in==inner.length) return true; 
     if(inner[in]==i) 
      in++;} 
    if(in==inner.length)return true; 
    return false; 
} 
+0

配列はソートされ、解はO(n)でなければなりません。 –

+0

読みやすいようにコードをインデントしてください。 –

+0

申し訳ありません私は複雑さがO(n)でなければならないことを理解していませんでしたコードを変更します;) – MI89

0

アイデアはループにあるアウターオーバーをし、外側の内側の内側をループする 途中でブレークが見られる場合は、ルールはすぐに偽を返します 最後にすべての配列にループされたインナーのインデックスがtrueを返します。

public boolean linearIn(int[] outer, int[] inner) { 
    int i, j; 
    // loop over the outer 
    for(i = 0, j =0; i < outer.length && j < inner.length; i++) { 
     // move to the last same value on the outer 
     while(i < outer.length-1 && outer[i] == outer[i+1]) { 
      i++; 
     } 
     // move to the last same value on the inner 
     while(j < inner.length-1 && inner[j] == inner[j+1]) { 
      j++; 
     } 
     // immediate false 
     if(inner[j] < outer[i]) { 
      return false; 
     } 
     // match - move to the next inner 
     if(inner[j] == outer[i]) { 
      j++; 
     } 
    } 
    if(j == inner.length) { 
     return true; 
    } 
    return false; 
}