字符塔需用双层for循环实现:外层控制行号i(建议0起始),内层分别输出前导空格(n-i-1个)、上升与下降字符(2*i+1个);推荐用char递增(如'a'起)而非字符串数组,避免越界与性能问题。

for循环嵌套控制行与列的边界
字符塔本质是逐行输出不同长度的字符串,每行字符数和空格数都依赖当前行号。用单层 for 只能控制行,必须嵌套一层控制每行内的空格和字符——外层 i 表示第几行(从 0 或 1 开始),内层分别处理前导空格、上升字符、下降字符。
- 行号起始选
0还是1直接影响i+1、2*i+1等表达式是否要调整,建议统一从0开始,避免越界 - 总行数为
n时,第i行(0-indexed)应有n - i - 1个前导空格、2 * i + 1个字符 - 别在内层循环里反复拼接字符串,用
StringBuilder或先算好长度再构建,否则String +=在循环中性能极差
用char类型做递增打印比字符串拼接更稳
想打出 A-B-C-D… 的塔?直接用 char c = 'A',然后在内层循环里 c++,比维护一个 String[] letters = {"A","B",...} 更轻量、不易索引越界。
- 注意大小写:大写字母 ASCII 是 65–90,小写是 97–122,超过就变乱码,加个
c 判断更安全 - 如果要循环打印(如 A-B-C-...-Z-A-B...),用
(c - 'A' + 1) % 26 + 'A',别手写条件重置 - 别用
System.out.print((char)(65 + i))这种硬编码,可读性差,也难改起始字符
常见错误:空格数错、换行漏写、索引越界
最常卡住的地方不是逻辑,而是输出格式细节——多一个空格、少一个换行、某行字符数对不上,整个塔就歪了。
- 忘记在每行末尾调用
System.out.println(),所有内容挤在一行 - 空格循环写成
for (int j = 0; j ,结果顶层多了 1 个空格,塔向右偏移 - 字符循环写成
j 却没确认 <code>i是否从 0 起,导致第 0 行输出 1 个字符(正确),但第 1 行输出 3 个(本该是 3),看似对实则靠运气——换行数一变就崩 - 用
Scanner.nextInt()读行数后,没消费掉回车符,下一行输入被跳过
兼容性提醒:别用增强for遍历动态生成的字符序列
字符塔是“边算边打”,不是已有数据集合。试图用 for (char c : generateRowChars(i)) 不仅多此一举,还容易因返回新数组引发 GC 压力,且无法控制空格位置。
立即学习“Java免费学习笔记(深入)”;
-
generateRowChars(i)这类方法需额外空间存整行字符,对 n=1000 就是上万字符,纯属浪费 - Java 8 的
IntStream.range(0, len).mapToObj(...)更重,还带函数式开销,没必要 - 真要抽象,只封装打印单行的逻辑,比如
printRow(int rowNum, int totalRows),保持主循环清晰
字符塔看着简单,但行数、起始字符、空格对齐、ASCII 边界、输出缓冲这五处任意一个没对齐,就会出人意料地错——尤其当把本地跑通的代码粘到 OJ 上,输入输出格式稍有差异,就全红。











