2016-08-09 3 views
2

Forいくつかの背景については、問題文があります。配列内の充填のストール(Big Java Ex 7.22)

トイレで男性は一般的に空いた場所の最も長いシーケンスの 中央を占有することによって、既に占有屋台から自分の距離を最大化するために を好むことをよく研究事実です。たとえば、 は、10個のストールが空である状況を考慮します。

_ _ _ _ _ _ _ _ _ _最初の訪問者は、中間位置を占めるであろう。

_ _ _ _ _ X _ _ _ _次の訪問者は、空き領域の中央においてであろう左。

_ _ X _ _ X _ _ _ _

ストールの数を読み出し、ストールは、充填時に1になったときに上記で与えられた形式で図をプリントアウトするプログラムを書きます。ヒント:ブール値の配列を使用して、ストールが占有されているかどうかを示します。

私はまた、私が大部分を理解している解決策を見つけましたが、ちょっとした理解に問題があります。ここでは、

import java.util.Scanner; 
class StallLogic 
{ 
    public void printStalls(boolean [] b) 
    { 
     for(boolean s:b) 
     { 
      System.out.print((s?"X" : "_") + " "); 
     } 
     System.out.print("\n"); 
    } 

    public boolean giveFlag(boolean [] b) 
    { 
     for(boolean s : b) 
     { 
      if(!s) return false; 
     } 
     return true; 
    } 

    public int getLongest(boolean [] b) 
    { 
     int length = 0, temp = 0; 
     int len = b.length; 
     for(int i = 0; i < len ; i++) 
     { 
      if (b[i] == false) 
      { 
       temp++; 
      } 
      else{ 
       temp = 0; 
      } 
      if (length < temp) 
       length = temp; 
     } 
     return length; 
    } 

    public int checkIndex(boolean [] b) 
    { 
     int length = 0 , temp = 0, ind = 0; 
     int len = b.length; 
     for (int i = 0 ; i < len ; i++) 
     { 
      if(b[i] == false) 
      { 
       temp++; 
      } 
      else{ 
       temp = 0; 
      } 
      if (length < temp) 
      { 
       ind = i -length; 
       length = temp; 
      } 
     } 
     return ind; 
    } 

    public void findStalls(boolean [] b) 
    { 
     int loc = checkIndex(b); 
     int len = getLongest(b); 
     int ind = loc + len/2; 
     b[ind] = true; 
    } 
} 

public class checkStall 
{ 
    public static void main(String [] args) 
    { 
    StallLogic stallin = new StallLogic(); 
    System.out.print("Enter number of stalls"); 
    Scanner in = new Scanner(System.in); 
    int i = in.nextInt(); 
    boolean [] stalls = new boolean [i]; 
    while(!stallin.giveFlag(stalls))  
    { 
     stallin.findStalls(stalls); 
     stallin.printStalls(stalls); 
    } 

    } 


} 

マイ闘争

私は悩みを抱えているが、checkIndexのポイントは本当に何であるかを理解しています。私はgetLongestことを理解し、私たちは、左側がgetLongest_より多くを持っていることを確認し_ _ _ _ _ X _ _ _ _に例えば最も連続_年代

を持っているのArrayListの部分を教えてくれる。今問題はXを置くための実際のインデックスが必要なことです。私たちのプログラムは、それを既存のXのすべての左側に置くべきか、それとも右側に置くのかをどのように知っていますか?これは私がcheckIndexが来ることを示しています。

特に私が混乱しているのは、何個あるかを特定し、それを特定のインデックスで追加している理由です。 I. int ind = loc + len/2;

ここでcheckIndexint ind = loc + len/2,は正確に何をしていますか?私は実現していないいくつかのアルゴリズムはありますか?

+2

標準の分裂征服アルゴリズムと思われます。あなたは中点式を理解していませんか? –

+1

このような練習のポイントは、理解していない解決策を盗むのではなく、自分の解決策を考え出すことです。あなたに最高のことを教える解決策が登場しています。 – Andreas

+1

私は試していないなら、私はこの質問をしなかったでしょう。私がそれを解決できなかったので、尋ねる全体のポイントがあります。 –

答えて

1

アルゴリズムを書き出すことなく、getLongestがストールの最長の空セクションの長さを戻しているように見えます。

次に、checkIndexは、同じセクションの最も左の空きストールを取得します。

これらの2つの数字を使用すると、単に差を分割して、そのストールを占めます。left + (length/2)


これは、ストールを「スキャン」することで効率が悪い方法です。 getLongestcheckIndexの方法を組み合わせて、int indを含めることが2つの方法の間の唯一の変更であるため、両方の位置のint[]を返すことができます。

+0

なぜcheckIndexは、最も左の空のストール?私はそれが単に互いに隣り合っている_の最大量を数えると思ったのですか?たとえば、_ _ _ _ _ _ _ _の長さは9、_ _ _ _ _ X _ _ _ _は現在のtemp = 5であり、古いtempがあるためXの後のtemp = 4は気にしません5. –

+0

'_ _ _ _ _ _ _ _ _ _ _ 'の場合、' checkIndex'は 'getLongest'が5を返す間に0を返すと思います。あなた自身をデバッグして確認してください。 –

+0

あなたは正しいです。私はgetLongestを意味することをお詫びします。私はあなたが言っていることを得ると思う、私はこのプログラムをトレースしようとします –