填充数组中的停顿(Big Java Ex 7.22)

时间:2016-08-09 16:19:51

标签: java divide-and-conquer

对于某些背景,这里是问题陈述。

  

一个经过充分研究的事实是,洗手间的男性通常更喜欢   通过占领来最大化它们与已占用的摊位的距离   中间最长的无人居住的地方。例如,   考虑十个摊位空的情况。

     

_ _ _ _ _ _ _ _ _ _第一位访客将占据中间位置:

     

_ _ _ _ _ X _ _ _ _下一位访客将位于左侧空白区域的中间。

     

_ _ X _ _ X _ _ _ _

     

编写一个程序,读取停顿数量,然后在停顿填充时,以上面给出的格式打印出图表,一次一个。提示:使用布尔值数组来指示是否占用了一个档位。

我也找到了我理解的解决方案,但我很难理解。这是

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,会告诉我们arraylist的哪些部分连续_

例如,在_ _ _ _ _ X _ _ _ _我们检查左侧是否有_getLongest。现在的问题是我们需要一个实际索引来放入X。我们的程序如何知道是将它放在每个预先存在的X的左侧还是右侧?这是我提出checkIndex进来的地方。

特别是我感到困惑的是为什么我最多计算了多少_并且添加了特定的索引? I.e int ind = loc + len / 2;

checkIndexint ind = loc + len / 2,到底在做什么?是否有一些算法,我没有意识到?

1 个答案:

答案 0 :(得分:1)

在没有写出算法的情况下,似乎getLongest正在返回最长空档位的长度。

然后,checkIndex获得同一部分最左边的空档。

使用这两个数字,您只需分割差异,然后占据该摊位left + (length / 2)

通过&#34;扫描&#34;这是一种效率较低的方法。摊位两次。可以合并getLongestcheckIndex方法以返回两个位置的int[],因为包含int ind是两种方法之间的唯一变化。