2016-10-26 10 views
0

私のプログラムは、配列の中で最も長い連続配列を見つけようとしていますが、出力が間違っています。配列の無駄な要素を削除する

public class longsec { 
    public int[] longestForward(int[] arr){ 
     int subSeqLength = 1; 
     int longest = 1; 
     int indexStart = 0; 
     int indexEnd = 0; 

     for (int i = 0; i < arr.length - 1; i++) 
     { 
      if (arr[i] == arr[i + 1] - 1) 
      { 
       subSeqLength++; 
       if (subSeqLength > longest) 
       { 
        longest = subSeqLength; 
        indexStart = i + 2 - subSeqLength; 
        indexEnd = i + 2; 
       } 

      } 
      else 
       subSeqLength = 1; 
     } 


     int T[] = new int[arr.length]; 
     for (int i = indexStart; i < indexEnd; i++) 


      T[i]= arr[i]; 


     return T; 

    }} 

入力

{23,10,22,5,33,8,9,21,50,41,60,80,99、22,23,24,25,26,27 }

出力

[0、0、0、0、0、0、0、0、0、0、0、0、0、22、23、24、25、26、27]

右出力

[22,23,24,25,26,27]

どうしたのですか?ありがとうございました。

+0

'int T [] = new int [arr.length];'はint型でなければなりません。T [] = new int [indexEnd-indexStart + 1]; 'おそらく' + 1'ではありません。睡眠が必要だ。とにかく、forループを調整する必要があります。 'T [i] = arr [i + indexStart];'または同様のもの。 – bradimus

+0

これを行うと "java.lang.ArrayIndexOutOfBoundsException"が返されます。 –

+0

'for'ループを調整しましたか? 'for(int i = 0; i bradimus

答えて

1

これは、入力した配列と同じサイズの配列を作成しているためです。ご覧のとおりです。

int T[] = new int[arr.length]; 

ただし、そのコードを変更すると、arrayIndexOutOfBoundsExceptionが発生します。

for (int i = indexStart; i < indexEnd; i++) 

     T[i]= arr[i]; 

なぜなら、indexStartは私的には配列の長さよりも長くなるからです。 したがって、indexStartからindexEndにループするのではなく、このような連続した数字の長さをループするだけです。

int T[] = new int[longest]; 

for(int i = 0; i < longest; i++) 
    T[i] = arr[i + indexStart]; 

これは、あなたに望ましい出力を与えるはずです。私がやっているのは、配列のindexStart値だけ反復をオフセットすることです。

関連する問題