首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現居中對齊楊輝三角:兩種演算法完整代碼

     編輯:Java 相關知識

楊輝三角規則回顧

  • 第 1 行:1
  • 第 2 行:1 1
  • 第 n 行:首尾為 1,中間數 = 上一行左右兩數之和

輸出範例(5 行):

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

完整可運行代碼

public class PrintYangHui {

    public static void main(String[] args) {
        printMethod1(5);
        System.out.println("--- 分隔線 ---");
        printMethod2(5);
    }

    /**
     * 方法一:手動賦值前兩行,後續按規則計算
     * 使用二維陣列模擬三角形結構,列寬 = 2*行數+1
     */
    public static void printMethod1(int line) {
        int[][] triangle = new int[line][2 * line + 1];

        for (int i = 0; i < line; i++) {
            for (int j = 0; j < 2 * line + 1; j++) {
                if (i == 0) { // 第 1 行
                    triangle[i][j] = (j == line) ? 1 : 0;
                } else if (i == 1) { // 第 2 行:手動設定 1 2 1
                    if (j == line) triangle[i][j] = 2;
                    else if (j == line - 2 || j == line + 2) triangle[i][j] = 1;
                    else triangle[i][j] = 0;
                } else { // 第 3 行及以後
                    if (j == 0) triangle[i][j] = triangle[i - 1][j + 1];
                    else if (j == 2 * line) triangle[i][j] = triangle[i - 1][j - 1];
                    else triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j + 1];
                }

                // 輸出:0 顯示為空格
                System.out.print(triangle[i][j] == 0 ? " " : triangle[i][j]);
            }
            System.out.println();
        }
    }

    /**
     * 方法二:僅賦值第 1 行,其餘完全按規則遞推
     * 更符合數學定義,代碼更簡潔
     */
    public static void printMethod2(int line) {
        int[][] triangle = new int[line][2 * line + 1];

        for (int i = 0; i < line; i++) {
            for (int j = 0; j < 2 * line + 1; j++) {
                if (i == 0) { // 僅第 1 行賦值
                    triangle[i][j] = (j == line) ? 1 : 0;
                } else {
                    if (j == 0) triangle[i][j] = triangle[i - 1][j + 1];
                    else if (j == 2 * line) triangle[i][j] = triangle[i - 1][j - 1];
                    else triangle[i][j] = triangle[i - 1][j - 1] + triangle[i - 1][j + 1];
                }
                System.out.print(triangle[i][j] == 0 ? " " : triangle[i][j]);
            }
            System.out.println();
        }
    }
}

兩種方法差異對比

維度方法一方法二
初始化行數前兩行手動設定僅第一行設定
邏輯複雜度較高(含特判)低(純遞推)
輸出結果完全一致完全一致
推薦程度教學演示生產/面試首選

進階優化:動態計算寬度、格式化對齊

public static void printPretty(int rows) {
    List> triangle = new ArrayList<>();
    // 1. 產生數值
    for (int i = 0; i < rows; i++) {
        List row = new ArrayList<>();
        for (int j = 0; j <= i; j++) {
            if (j == 0 || j == i) row.add(1);
            else row.add(triangle.get(i - 1).get(j - 1) + triangle.get(i - 1).get(j));
        }
        triangle.add(row);
    }
    // 2. 計算最大數字寬度(最後一行中間最大)
    int maxNumWidth = String.valueOf(triangle.get(rows - 1).get(rows / 2)).length();
    int colWidth = maxNumWidth + 1; // 加一空格間隔

    // 3. 列印置中
    for (int i = 0; i < rows; i++) {
        // 前導空格
        System.out.print(" ".repeat((rows - 1 - i) * colWidth));
        for (int num : triangle.get(i)) {
            System.out.printf("%" + colWidth + "d", num);
        }
        System.out.println();
    }
}

輸出效果更優雅,適應任意行數與數字寬度。

總結

楊輝三角是經典演算法練習,核心在於「二維陣列索引映射」與「邊界條件處理」。方法二更符合數學遞推定義,代碼簡潔健壯。實務中可結合 List<List<Integer>> 動態存儲,配合 printf 格式化輸出,獲得最佳視覺效果。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved