对于某些背景,这里是问题陈述。
一个经过充分研究的事实是,洗手间的男性通常更喜欢 通过占领来最大化它们与已占用的摊位的距离 中间最长的无人居住的地方。例如, 考虑十个摊位空的情况。
_ _ _ _ _ _ _ _ _ _第一位访客将占据中间位置:
_ _ _ _ _ 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;
checkIndex
和int ind = loc + len / 2,
到底在做什么?是否有一些算法,我没有意识到?
答案 0 :(得分:1)
在没有写出算法的情况下,似乎getLongest
正在返回最长空档位的长度。
然后,checkIndex
获得同一部分最左边的空档。
使用这两个数字,您只需分割差异,然后占据该摊位left + (length / 2)
。
通过&#34;扫描&#34;这是一种效率较低的方法。摊位两次。可以合并getLongest
和checkIndex
方法以返回两个位置的int[]
,因为包含int ind
是两种方法之间的唯一变化。