5

これは実際にインタビューの質問でした。Javaを使用して以下を印刷する必要がありました。

9
9 8 9
9 8 7 8 9
9 8 7 6 7 8 9
. . .
. . .

インタビュー中に恥ずかしいコードを書きましたが、それでもうまくいきました - 外側のループ、2 つの内側のループ (1 つは減分シーケンス用、もう 1 つは増分シーケンス用です!) と大量の変数を使用します。変数の 1 つは、各行の長さでした。

インタビュアーは私にそれを使って書き直すように頼んだ

  • 1 つの外側ループと 1 つの内側ループのみ

  • 行長変数なし。

注: 回答を見た後、インタビュアーは 2 番目の条件を本当に意味していなかったと思います。彼は私のコードを単純化することを望んでいたのかもしれません。

それで、後で家に帰って、私はこれにたどり着きました:

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

ここでは、内側のループを 1 つだけ使用しています。値を使用して、delta増分または減分が発生するかどうかを判断しています。行ごとに、現在のインデックスを行の中間点と比較し、デルタを変更します。

最初の条件 - 内側のループが 1 つだけ - を満たしました。しかし、行の長さを使わないとできません。

行の長さを知らずにこれを印刷するにはどうすればよいでしょうか?

多くの回答が受け入れられましたが、私は 1 つを選択する必要があり、最も理解しやすいものを選びました。

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

私の非再帰的な解決策:

    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 に答える
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 に答える