2016-03-27 14 views
0

私は問題に取り組んでいました。ここに問題があります。配列内の整数の差JAVA

あなたはハイキングコースを歩いています。このハイキングコースには、1キロメートル毎に標高マーカーがあります。標高情報は、整数の配列で表されます。たとえば、標高配列が[100、50、20、30、50、40]の場合は、キロメートル0を意味し、標高は100メートルです。キロメートル1では、標高は50メートルです。キロメートル2では、標高は20メートルです。キロメートル3で、標高は30メートルです。キロメートル4では、標高は50メートルです。キロメートル5では、標高は40メートルです。

b)longestUphillというメソッドを作成し、最長の上り坂セクションの標高の変化をメートルで返します。上記の例では、最長の上りセクションが20メートルの2キロメートルから50メートルのキロメートル4までであるため、メソッドは30を返します。高度の変更は50 - 20 = 30メートルです。

これまで私がこれまで持っていたことは次のとおりです。

public int longestUphill(int[] elevation) 
{ 
    int end,longest=0; 
    for(int i=0;i<elevation.length-1;i++){ 
    end = i+1; 
    while(elevation[end]-elevation[i]>=0){ 
     end++; 
    } 
    if(elevation[end]-elevation[i]>longest) longest = elevation[end]-elevation[i]; 
} 
return longest; 
} 

ありがとうございます!

+2

あなたはどのように立ち往生していますか?あなたのコードにあなたの概念上の問題が何であるか教えてください。 –

+0

いいえ...あなたが望むもの – smac89

答えて

1

あなたが書いたものを捨てて(!)もう一度やり直すことをお勧めします。

ヒント:

  1. が最も長い上り坂のセクションを検索:二つの部分に問題を打破します。ヒント:上り坂セクションは、セクション内のすべてiの場合はelevation[i - 1] < elevation[i]です。

  2. 特定のセクションで標高の変化を検索します。ヒント:セクションがすべて上り坂であることが分かっている場合は、これを行う簡単な方法があります。

+0

あなたはそれを共有できますか?私はちょっとJavaに新しいです:) – DavosSnow

+2

いいえこれはあなたの宿題です。アイデアは、あなた自身でコードを書くことによって<< >>を学ぶことです。自分のやり方をやっていないなら、あなたはいつも「Javaの初心者」になるでしょう。 –

+0

@StephenCあなたは正しいです... – gifpif

0

単純な論理反復配列と比較し、結果を保存...

  1. 反復配列と次の要素が高い値が結果の違いを追加している場合は、次の要素
  2. で現在の要素を比較します。
  3. その他の結果を比較して高い値を保存するロジック。
    3.1保存値の場合は、結果値を保存値と比較します。
    3.2結果がより高い場合は、結果を保存に置き換えます。
  4. 戻り値を保存します。
0

ここにあなたの答えです...私はこれがあなたが探しているものだと思います! XDは

public static int longestUphill(int[] elevation){ 
    int longest=0; 
    for(int i=0;i<elevation.length-1;i++){ 
     if(elevation[i]<elevation[i+1]){ 
      int temp= elevation[i+1]-elevation[i]; 
      for(int j=i+1;j<elevation.length-1;j++){ 
       if(elevation[j]<elevation[j+1]){ 
        temp += elevation[j+1]-elevation[j]; 
       } 
       else{ 
        if(longest<temp) 
         longest= temp; 
        i=j; 
        break; 
       } 
      } 
     } 
    } 
    return longest; 
} 

うーん...アイデアは、標高の配列を反復処理し、実際の値が次の1未満である間、最長の変数をインクリメント開始することです。次のものが実際の(他の穴、上り坂)よりも低い場合は、jの値でiを更新するので、jのループで以前に分析されたものをメインループで再度解析しません。

+0

あなたは説明を追加できますか? – Rakete1111

+0

私はちょうど答えを編集しました....ありがとう。 – Zero

0
for (int i=0;i<elevation.length-1;i++){ 

      if(elevation[i] < elevation[i+1]){ 

       temp += (elevation[i+1] - elevation[i]); 

      } 

それは基本的にこの道を行く: は、次のいずれかよりも、現在の要素<のですか?そうであればそれらの間の差を合計し、一時変数であるtemp varに保存します。

else { 
     if(result<temp) 
      result = temp; 
      temp = 0; 
    } 

は、最初の条件AINTは、私たちが一時>その結果、我々は結果にそれを保存し、最後に0

return (result<temp)?temp:result; 

に一時変数をリセットしそうならば初期値は0である一時に対して結果を比較し、次に会ったならば、我々実際の結果をtempと比較して最高の上り坂を返します。これは、最大値に戻す値を設定します。

public static int[] arr={100,50,20,30,50,40}; 

    public static int longestUphill(int[] elevation){ 
     int temp=0,result=0; 

     for (int i=0;i<elevation.length-1;i++){ 

      if(elevation[i] < elevation[i+1]){ 

       temp += (elevation[i+1] - elevation[i]); 

      } 
      else { 
       if(result<temp) 
        result = temp; 
       temp = 0; 
      } 

     } 

     return (result<temp)?temp:result; 
    }