5

这实际上是一个面试问题。我必须使用 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值来确定是增加还是减少。对于每一行,我将当前索引与行的中点进行比较并更改增量。

我满足了第一个条件——只有一个内循环。但是如果不使用行长,我就无法做到这一点。

我们如何在不知道行长的情况下打印它?

很多答案都是可以接受的,但我必须选择一个,并选择一个对我来说最容易理解的。

4

5 回答 5

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());
    }
于 2013-02-26T12:15:17.513 回答
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);
}
于 2013-02-26T12:52:06.760 回答
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/>';
}
于 2013-02-26T12:17:42.370 回答
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

该迭代解等价于递归解。我更喜欢使用迭代而不是递归,因为当行数变大时,递归解决方案所需的额外堆栈内存可能会很大。

于 2013-02-26T15:29:56.347 回答
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();
    }
于 2013-02-27T20:00:10.387 回答