实心菱形需按行号计算空格与星号数:上半部分第i行空格=(n+1)/2−i、星号=2i−1;下半部分第j行空格=j、星号=n−2j;空心菱形仅在边界位置打印*,其余为空格。

Java 打印实心菱形:关键在对称轴与行内空格/星号数量关系
实心菱形本质是上下对称的两段三角形拼接,核心在于每行的 空格数 和 星号数 必须随行号线性变化。很多人直接硬编码上下两半,结果行数一变就错。
- 假设总行数为奇数
n(如 5、7),则中间行为第(n+1)/2行;上半部分(含中行)行号i从 1 到(n+1)/2,该行空格数 =(n+1)/2 - i,星号数 =2*i - 1 - 下半部分行号
j从 1 到(n-1)/2,空格数 =j,星号数 =n - 2*j - 别用
System.out.print("*")在内层循环反复调用——字符串拼接或StringBuilder更稳,尤其行数大时避免 I/O 频繁刷屏卡顿
Java 打印空心菱形:只打边界位置,其余全空格
空心和实心唯一区别是:每行只在「首、尾星号位置」输出 *,中间全用空格填充。难点不在逻辑,而在边界判断写错导致某行少打或多打一个 *。
- 上半部分(含中行):第
i行,若i == 1或i == (n+1)/2,整行都是*;否则只在位置0和2*i-2(索引从 0 开始)放*,其余填空格 - 下半部分:类似处理,但注意星号位置要对应上半部分镜像,比如第
j行(从 1 开始计),星号应在索引j-1和n-j处 - 常见错误:
for循环边界用还是 <code> 混乱,导致某行多一个空格或少一个星号;建议统一用 <code>0-based索引推导,再转成print逻辑
嵌套循环层数控制:两层足够,三层纯属自我惩罚
无论实心还是空心,**最多只需两层循环**:外层控行,内层控列。有人写三层(比如再拆空格循环 + 星号循环 + 换行),不仅难读,还容易让空格/星号数量错位。
- 推荐结构:外层
for (int i = 0; i ,内层 <code>for (int j = 0; j ,其中 <code>width是当前行总字符宽度(等于最大星号数,即n) - 每行先构造一个长度为
width的char[],初始化为空格;再按规则把*填进指定索引;最后new String(arr)输出 - 避免在内层循环里做条件判断并混合
print—— 容易漏掉换行或空格,调试时输出错位根本看不出哪行出问题
输入校验与边界场景:偶数行、n=1、n=0 不是“理论上不会”,而是“线上真会遇到”
用户输个 4 或 -1,程序直接崩或打出畸形图形,不是健壮性问题,是设计缺失。
- 必须检查输入是否为正奇数;如果不是,要么提示重输,要么自动向上取最近奇数(如输入 4 → 按 5 处理),但得明确告知用户
-
n = 1时,实心是单个*,空心也是单个*(别写成空行);n = 3是最小可辨识菱形,务必手动验证这两组输出 - 别忽略控制台字体等宽特性——如果用 IDE 控制台跑,确保字体设为
Monospaced,否则空格和星号宽度不一致,图形歪斜
空心菱形最易错的是中间那几行的「首尾星号索引」计算,稍不注意就变成三角形或者上下不对称;还有人用 String.repeat()(Java 11+)偷懒,却忘了低版本运行时报 NoSuchMethodError。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











