注1:我已经有了蛮力,冗长,循环的凌乱代码 注2:寻找更优雅的方法来建立这个 - "较小的"行数和聪明的逻辑。 注3:不做作业,我是一个想要改进的业余爱好者。
要编码的功能:
printNumericPyramid(int depth, String alignment, String orientation);
深度:+ ve整数最多4个
alignment:" left" /" right"
方向:"直立" /"倒立"
0将始终位于顶点,无论是直立还是倒置
0259/9520永远是金字塔的高度。
样本调用和预期输出:
printNumericPyramid(4, "left", "inverted");
9876
543.
21..
0...
printNumericPyramid(4, "right", "upright");
...0
..12
.345
6789
printNumericPyramid(4, "right", "inverted");
6789
.345
..12
...0
printNumericPyramid(4, "left", "upright");
0...
21..
543.
9876
如果"较小"那将是很好的行数可能是建议解决方案的重点。不是删除所有换行符:),而是通过最小化代码(即使它会损害可读性)。
答案 0 :(得分:1)
(首先请注意,您的方法定义容易出错:如果参数只能使用两个值,则可以使用布尔值而不是字符串。如果您错误地“左”或“右”或“倒”或者“直立”,你的方法会起作用但产生错误的结果)
如果你想专注于少量的行,那么你不应该重复自己,你可以使用三元运算符和可用的Java API。
public void printNumericPyramid( final int depth, final String alignment, final String orientation ) {
for (int i = 0; i < depth; i++) {
for (int j = 0; j < depth; j++) {
System.out.print ( ... ) // insert some smart hackery in here computing if we should print 0-9 or '.'
}
System.out.println();
}
}
然而,这可能不会变得容易阅读,并且很容易弄错逻辑。
所以我写了另一个解决方案:
在每个字符上打印下一个值(从0到9)或打印一个点'。'。
当一行“完成”时,我要么添加该行,要么反转该行,具体取决于 alignment 参数的值。
如果询问了反转表示,您可以简单地反转集合
public void printNumericPyramid( final int depth, final String alignment, final String orientation ) {
final List<String> l1 = new ArrayList<String>();
for (int i = 0, c = 0; i < depth; i++) {
final StringBuilder sb = new StringBuilder();
for (int j = 0; j < depth; j++) {
sb.append( j >= depth - (i + 1) ? c++ : "." );
}
l1.add("left".equals(alignment) ? sb.reverse().toString() : sb.toString());
}
if ( "inverted".equals(orientation) ) Collections.reverse(l1);
for ( final String s : l1 ) {
System.out.println( s );
}
}