这实际上是一个面试问题。我不得不使用Java打印以下内容:
9
9 8 9
9 8 7 8 9
9 8 7 6 7 8 9
. . .
. . .
在采访中,我写了一段令人尴尬的代码,但它仍然有效 - 使用外循环,两个内部循环(一个用于递减序列,一个用于递增序列!)和一大堆变数。其中一个变量是每行的长度。
面试官让我尝试使用
重写它只有一个外环和一个内环
没有行长度变量。
注意:在看了答案之后,我认为面试官并不真正意味着第二个条件。他可能只是想让我简化我的代码,第二点只是从他的嘴里蹦了出来。
所以,后来回到家里,我到了这里:
int rowCnt = 5;
for(int i = 1; i <= rowCnt; i++)
{
int val = 9;
int delta = -1;
int rowLen = i * 2 - 1;
for(int j = 1; j <= rowLen; j++)
{
System.out.print(val + " ");
val += delta;
if(j >= rowLen / 2) delta = 1;
}
System.out.println();
}
在这里,我只使用一个内循环。我正在使用delta
值来确定是否发生递增或递减。对于每一行,我将当前索引与行的中点进行比较并更改增量。
我满意第一个条件 - 只有一个内循环。但是如果不使用行长,我就无法做到。
如何在不查找行长度的情况下打印出来?
许多答案都是可以接受的,但我必须选择一个,然后挑选一个最容易理解的答案。
答案 0 :(得分:2)
怎么样:
int start = 9;
for (int i = 0; i <= start; i++) {
StringBuilder sb = new StringBuilder((start - i) + " ");
for (int j = start - i; j < start; j++) {
sb.insert(0, (j + 1) + " ");
sb.append((j + 1) + " ");
}
System.out.println(sb.toString());
}
答案 1 :(得分:2)
他们可能希望听到“递归”这个词。
这是一个不需要长度的递归解决方案:
countDownInMiddle("", 9, "");
private static void countDownInMiddle(String start, int n, String end) {
if (n < 0) {
return;
}
System.out.println(start + n + end);
countDownInMiddle(start + n, n - 1, n + end);
}
答案 2 :(得分:1)
这是一个简单的PHP,希望逻辑清晰,易于移植到Java:
$rowCount = 10;
$startNum = 9;
for ($idx =0; $idx <$rowCount; $idx ++) {
for ($jdx=0; $jdx < (2*$idx +1); $jdx++) {
if ($idx < $jdx)
echo $startNum -(2*$idx) + $jdx.' ';
else
echo $startNum - $jdx.' ';
}
echo '<br/>';
}
答案 3 :(得分:0)
public class Pyramid {
public static void main(String[] args) {
int start = 9;
String left = "";
String right = "";
for (int i=start; i>=0; i--) {
System.out.println(left+i+right);
left = left+i;
right = i+right;
}
}
}
示例输出:
9
989
98789
9876789
987656789
98765456789
9876543456789
987654323456789
98765432123456789
9876543210123456789
这种迭代解决方案相当于递归解决方案。我宁愿使用迭代而不是递归,因为当行数变大时,递归解决方案所需的额外堆栈内存可能很大。
答案 4 :(得分:0)
我的非递归解决方案:
for(int i = 0; i < 9; i++) {
for(int j = 0; j < 2*i+1; j++)
System.out.print((Math.abs(j - i) + 9 - i) + " ");
System.out.println();
}