如何在满足这些条件的同时打印以下序列

时间:2013-02-26 11:59:46

标签: java algorithm

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

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

如何在不查找行长度的情况下打印出来?

许多答案都是可以接受的,但我必须选择一个,然后挑选一个最容易理解的答案。

5 个答案:

答案 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();
    }