2016-11-20 8 views
-2

私はcodingbat.com上でこの問題に出くわした:Problemこれを解決するには(http://codingbat.com/prob/p168357) 'codingbat'の例を効率的に使用しますか?

問題:

はintの配列を考えると、配列は2 7の隣同士が含まれている、または2 7のいずれかによって分離がある場合にtrueを返します要素では、{7,1,7}を使用します。

has77([1、7,7])真

has77([1、7、1、7])→真

has77([1、7、1、1、7→ ])→false

私はそれを解決しましたが、私のアプローチは効率的ではありません。私の解決策のコードは問題に比べて大きいです。誰でも私にこの問題をスマートな方法で解決する方法を教えてもらえますか?

マイコード:

public boolean has77(int[] nums) { 
    int i = 0; 
    int arraylength = 0; 
    while(i != nums.length){ 
    if(nums[i] == 7){ 
     arraylength++; 
    } 
    i++; 
    } 
    int[] sevens = new int[arraylength]; 
    if(arraylength == 0){ 
    return false; 
    } 
    i =0; 
    int j = 0; 
    while(i != nums.length){ 
    if(nums[i] == 7){ 
     sevens[j] = i; 
     j++; 
    } 
    i++; 
} 
i = 0; 
while(i != arraylength-1){ 
    if(sevens[i+1] - sevens[i]==1 || (sevens[i+1]- sevens[i]==2)){ 
     return true; 
} 
i++; 
} 
return false; 
} 
+1

効率的ですか?一度だけ配列を反復する。現在の要素が7、前の要素、またはそれ以前の要素が7の場合はtrueを返します。 – Andreas

+0

次の有権者は、私が次回に注意を払うように投票の理由を説明する方が良いでしょう。ちょうどリクエスト! – Deepeshkumar

+1

私はダウン投票者ではありませんが、リンクを提供するだけではありません。リンクが機能しない可能性がありますので、必ずあなたの質問に関連する部分を含めてください。あなたはまだ完全な参照のためのリンクを提供することができます。 – Andreas

答えて

1

この答えはがそれを行う方法をあなたにを教えてくれますが、あなたのコードを与えることはありません。コードを書くことは、あなたがCodingBatに対する挑戦を受け入れることを選択したので、あなたがすることです。

より効率的に解決策:アレイを1回だけ反復します。現在の要素が7、前の要素、またはそれ以前の要素が7の場合は、trueを返します。

+0

関数の引数が配列の場合、あなたが話しているロジックは動作しません:[7,7,1,1,7] – Deepeshkumar

+0

なぜですか?私はそれをコーディングしてみましたが、初めて完全に動作しました。 – Andreas

+0

公開ブール型has77(int [] nums){ int i = 0; int indexseven = 0; while(i!= nums.length){ if(nums [i] == 7){ indexseven = i; } i ++; } if(nums [indexseven-1] == 7){ がtrueを返します。 (nums [indexseven-2] == 7){ を返します } falseを返します。 } – Deepeshkumar

0

私は最終的に質問にひびきました。 コードは次のとおりです。

public boolean has77(int[] nums) { 
     int i = 0; 
     while(i != nums.length){ 
      if(nums[i]==7 && i!=0){ 
       if(nums[i-1] == 7){ 
        return true; 
       } 
      } 
     if(nums[i]==7 && i>1){ 
      if(nums[i-2] == 7){ 
       return true; 
      } 
     } 
     i++; 
     } 
    return false; 
    } 
+0

3つのコメント:1)if(nums [i] == 7 && i!= 0)の中で 'if(nums [i] == 7 && i> 1)'を動かすと、 'nums [i] == 7'を2回確認してください。 2) 'i = 1'で始めると' i!= 0'は必要ありません。 3)なぜ配列を反復するために 'for'ループの代わりに' while'ループを使用しますか? – Andreas

+0

レビューをいただき、ありがとうございます。まあ、私はループを使わずに理由もありません。それは良い習慣ではありませんか? – Deepeshkumar

+1

'int i = 0'、 'i!= nums.length'、' i ++ 'を一つの構造体としてまとめているので、この種のループに' for'ループを使う方が良いでしょう。ループ全体のロジックは1つの場所にあります。また、 'i'変数は' for'ループにスコープされます。 – Andreas

関連する問題