我的目标是创建一个包含22个元素的数组,其中必须有11个元素" G"和11个元素" B"。数组中的每个第5个元素都是" B"。
也就是说,数组中的第5个元素是B,第10个是B,第15个是B,第20个是B.数组应该在最后一个元素后面并跳过现有的B元素,因此下一个B是第3个元素,后跟第9个元素,依此类推。
到目前为止,这是我的代码和现有输出:
private static ArrayList<String> circle;
public static void main(String[] args) {
// TODO Auto-generated method stub
circle = new ArrayList<String>();
for(int i=0; i< 22; i++){
circle.add("G");
}
for(int i=0; i<circle.size(); i++){
if((i+1) % 5 == 0){
circle.set(i, "B");
}
}
for(int i=0; i<circle.size(); i++){
System.out.printf("%3d", (i+1));
}
System.out.print("\n");
for(int i=0; i<circle.size(); i++){
System.out.printf("%3s", circle.get(i));
}
}
/* Output */
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
G G G G B G G G G B G G G G B G G G G B G G */
所需的输出是
/* Desired Output */
/* 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
B G B G B B G B G B B G B G B G G B G B G G */
我该如何解决? 谢谢!
答案 0 :(得分:1)
这是重要的循环位 - 它取代了在原始代码中设置B的for循环。
int numBs = 0;
int idx = 4;
while (numBs < 11) {
Circle.set(idx % 22, "B");
numBs++;
idx += 5;
}
它从索引4开始(因为第一个元素是0,第五个元素是索引4)。
然后每次只增加5 idx
。神奇的是模运算符,它使它环绕。
idx: 4 9 14 19 24 29
idx % 22: 4 9 14 19 2 7
element: 5 10 15 20 3 8
这并不能保证你有任何数组大小的11个B - 因为如果前面的元素是G,你只需要增加numBs
。
输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
B G B G B B G B G B B G B G B G G B G B G G
答案 1 :(得分:1)
int max = 22;
int count = 0; // count number of B's
String x[] = new String[22];
int i = 4; // starting index
while (count < 11) {
x[i] = "B";
count++;
int c = 0;
// we will take five steps to find new index
while (c < 5) {
i++;
i%=22;
if(x[i] == "B") ; // dont count it as step if its already B
else c++;
}
}
// fill with G
for (i = 0; i < 22; i++) {
if (x[i] != "B")
x[i] = "G";
}
System.out.println(Arrays.toString(x));
输出
[B, G, B, G, B, G, B, G, B, B, G, G, G, B, B, B, G, G, G, B, G, B]
答案 2 :(得分:0)
你说你想要的输出有点不正确。在第3个元素之后,必须在B而不是第9个元素上设置第8个元素。用“G”s填充列表后,此循环应该足够了:
cut
Here是代码的演示。如果你可以,你可能想要使用一个字符数组而不是一个字符串列表。