印刷一排星星

时间:2018-07-25 13:48:59

标签: java

我正在尝试创建一个带有两个参数的方法:星数和行长。我希望该方法从行的中间打印星星,然后向外扩展。

星星数必须小于或等于行长,并且行长必须为奇数。

如果我打个电话

rowofStars(3,5);

我想要的输出是:

" *** "

但是如果我打电话

rowofStars(2,5);
rowofStars(4,5);

输出应为:

" * * "
"** **"

引号仅用于显示行的长度(在本例中为5个字符空间)。

我能弄清楚的是,这涉及一个for循环,长度是循环的极限,如果星数==奇数,则

for(int i = 0; i < length; i++){

    //Set of rules should be here

    if(num % 2 == 1 && i == length % 2 + 1){
        System.out.print("*");
    } else {
        SYstem.out.print(" ");
    }
}

但是我无法弄清楚其余规则,以便按照我希望的方式打印星星。

2 个答案:

答案 0 :(得分:1)

// 1. Create a character array with the given length:
char[] charArray = new char[length];

// 2. Fill this entire array with spaces initially:
java.util.Arrays.fill(charArray, ' ');

// 3. Fill the middle of the array with the appropriate amount of '*'
// num amount of times for odd, and num+1 amount of times for even
java.util.Arrays.fill(charArray, length/2 - num/2, length/2 + num/2 + 1, '*');

// 4. If the num was even, change the center spot back to a space:
if(num%2 == 0)
  charArray[length/2] = ' ';

// 5. Convert the character-array to a String
String result = new String(charArray);

// 6. And output the String:
System.out.println(result);

示例输入:num=4; length=7

  • 在第1步和第2步之后,我们现在有了一个包含7个空格的字符数组:[' ',' ',' ',' ',' ',' ',' ']
  • 第3步之后,我们现在使用5个'*'填充了数组的中间部分:[' ','*','*','*','*','*',' ']
  • 在第4步之后:现在中心回到了一个空格,因为4的num是偶数:[' ','*','*',' ','*','*',' ']
  • 在第5步和第6步之后:字符数组已转换为String(" ** ** ")并打印到STDOUT。

Try it online.

†:以下是计算部分的说明:

假设在此示例中,长度为7,但num的范围为0到7。我们将获得以下计算。由于我们正在使用整数,因此/2将进行整数除,从而隐式地截断十进制值:

inputs     calculations                              indices

0,7   ->   (7/2=3)-(0/2=0), (7/2=3)+(0/2=0)+1   ->   3,4
1,7   ->   (7/2=3)-(1/2=0), (7/2=3)+(1/2=0)+1   ->   3,4
2,7   ->   (7/2=3)-(2/2=1), (7/2=3)+(2/2=1)+1   ->   2,5
3,7   ->   (7/2=3)-(3/2=1), (7/2=3)+(3/2=1)+1   ->   2,5
4,7   ->   (7/2=3)-(4/2=2), (7/2=3)+(4/2=2)+1   ->   1,6
5,7   ->   (7/2=3)-(5/2=2), (7/2=3)+(5/2=2)+1   ->   1,6
6,7   ->   (7/2=3)-(6/2=3), (7/2=3)+(6/2=3)+1   ->   0,7
7,7   ->   (7/2=3)-(7/2=3), (7/2=3)+(7/2=3)+1   ->   0,7

此结果列表来自Arrays.fill方法中{* 3}}中的'*'字符所需的索引。

答案 1 :(得分:0)

您可以分步进行

  • 输入正确的空格数
  • 输入正确的星星数
  • 将其反向等效项保存到结尾
  • 放置中间元素
  • 结束

static String rowofStars(int nbStars, int size){
    if(nbStars>size) throw new IllegalArgumentException("nbStars>size");
    StringBuilder sb = new StringBuilder();
    int nbStarsOneSide = nbStars/2;
    int nbOneSide = size/2;

    for(int i=0; i<(nbOneSide-nbStarsOneSide); i++){
        sb.append(" ");
    }

    for(int i=0; i<nbStarsOneSide; i++){
        sb.append("*");
    }

    String secondSide = new StringBuilder(sb.toString()).reverse().toString();
    sb.append(nbStars%2 != 0 ? "*" : " ");
    sb.append(secondSide);
    return sb.toString();
}

https://ideone.com/tOTQ0T