LeetCode 补充题 148. 对称数字三角形
题目描述
给定整数
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 可以直接转换为单个数字字节。只在行首补空格,末尾不补空格。每行独立生成字符串加入结果,输出全部行的字符总量为二次规模。
解题步骤
- 第 i 行先添加 n-i 个前导空格。
- 追加 1 到 i,再追加 i-1 到 1,避免重复中心数字。
- 保存该行,不追加尾部空格,继续下一行。
代码实现
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时需另定多位数字的对齐规则。
转载与许可
许可
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!