题目描述

给定整数 n,其中 1≤n≤9,返回 n 行对称数字字符串。

第 i 行有 n-i 个前导空格,随后是 1…i 和 i-1…1,末尾无空格。

示例 1:

输入: n = 3
输出:

["  1"," 121","12321"]

解释: 前三行分别有 2、1、0 个前导空格;每行数字从 1 递增到行号,再递减至 1。

提示:

  • 1≤n≤9。
  • 第 i 行恰有 n-i 个前导空格。
  • 数字为 1…i…1,末尾没有空格。

题意分析

每行的内容由行号直接确定,不依赖上一行:前导空格负责定位中心,两段数字负责左右对称。按这三个部分拼接即可,不需要二维矩阵或上一行递推。

解法:逐行拼接空格与对称数字

核心思路

[!blue]

第 i 行先写 n-i 个空格,再写 1~i,最后写 i-1~1。递减段从 i-1 开始,确保中心数字 i 只出现一次;第 1 行的递减段为空。

中心之前共有 n-i 个空格和 i-1 个数字,总数恒为 n-1,因此各行中心对齐。题面限制 n <= 9,每个数字恰好占一列,Go 可以直接转换为单个数字字节。

只在行首补空格,末尾不补空格。每行独立生成字符串加入结果,输出全部行的字符总量为二次规模。

解题步骤

  1. 第 i 行先添加 n-i 个前导空格。
  2. 追加 1 到 i,再追加 i-1 到 1,避免重复中心数字。
  3. 保存该行,不追加尾部空格,继续下一行。

代码实现

class Solution {
    public List<String> triangle(int n) {
        List<String> out = new ArrayList<>();

        for (int i = 1; i <= n; i++) {
            StringBuilder row = new StringBuilder(" ".repeat(n - i));

            for (int j = 1; j <= i; j++) {
                row.append(j);
            }

            for (int j = i - 1; j >= 1; j--) {
                row.append(j);
            }

            out.add(row.toString());
        }

        return out;
    }
}
import "strings"

func triangle(n int) []string {
    out := make([]string, 0, n)
    for i := 1; i <= n; i++ {
        row := []byte(strings.Repeat(" ", n-i))
        for j := 1; j <= i; j++ {
            row = append(row, byte('0'+j))
        }
        for j := i - 1; j >= 1; j-- {
            row = append(row, byte('0'+j))
        }
        out = append(out, string(row))
    }
    return out
}

复杂度分析

  • 时间复杂度:$O(n^2)$。
  • 空间复杂度:结果空间 $O(n^2)$。

关键点总结

[!green]

中间数字始终位于同一列;n≤9 保证每个数字占一列。该题是固定输出格式练习。

易错点总结

[!yellow]

这里的每行是对称数字串,不是杨辉三角;超过9时需另定多位数字的对齐规则。

转载与许可
作者
链接 https://hgnulb.github.io/blog/2026/72074561
许可 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!