当前位置:首页 > 后端开发 > 正文

Java如何打印空心菱形?

使用Java打印空心菱形需将图形分为上下两部分:上半部分由递增的空格和星号组成,下半部分递减,关键逻辑是每行仅首尾输出星号,中间填充空格,通过循环控制空格数和星号位置实现空心效果。

以下是用Java打印空心菱形的详细方法,包含代码实现、逻辑解释和优化建议,适合不同基础的访客理解:

核心思路

空心菱形由对称的上下三角形组成,关键点在于:

  1. 空格控制:定位每行起始位置
  2. 星号规则:首尾位置打印星号,中间用空格填充
  3. 对称分割:分上半部分(递增)和下半部分(递减)

完整代码实现

import java.util.Scanner;
public class HollowDiamond {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入菱形高度(奇数): ");
        int n = scanner.nextInt();
        // 确保输入为奇数
        if (n % 2 == 0) {
            System.out.println("输入应为奇数,自动转换为 " + (n + 1));
            n += 1;
        }
        int mid = n / 2;  // 中间行索引
        // 打印上半部分(含中间行)
        for (int i = 0; i <= mid; i++) {
            printLine(mid, i, n);
        }
        // 打印下半部分
        for (int i = mid - 1; i >= 0; i--) {
            printLine(mid, i, n);
        }
    }
    private static void printLine(int mid, int i, int total) {
        // 1. 打印前导空格
        for (int j = 0; j < Math.abs(mid - i); j++) {
            System.out.print(" ");
        }
        // 2. 打印第一个星号
        System.out.print("*");
        // 3. 计算中间空格数
        int innerSpace = total - 2 * Math.abs(mid - i) - 2;
        // 4. 打印中间空格和尾星号(非首行)
        if (innerSpace > 0) {
            for (int j = 0; j < innerSpace; j++) {
                System.out.print(" ");
            }
            System.out.print("*");
        }
        // 5. 换行
        System.out.println();
    }
}

关键逻辑说明

  1. 输入处理

    Java如何打印空心菱形?  第1张

    • 要求输入奇数高度(偶数自动+1)
    • 示例:输入5生成标准菱形
  2. 行数计算

    int mid = n / 2;  // 示例:n=5时 mid=2(0起索引)
  3. 空格规律
    | 行号(i) | 前导空格数 | 中间空格数 | 输出示例 |
    |———|————|————|———-|
    | 0 | 2 | -1 | |
    | 1 | 1 | 1 | |
    | 2 | 0 | 3 | |

  4. 核心公式

    • 前导空格:Math.abs(mid - i)
    • 中间空格:总宽度 - 2*前导空格 - 2
    • 尾星号条件:中间空格数 > 0

运行示例

输入高度5时输出:

优化建议

  1. 动态构建:改用StringBuilder减少IO操作
    StringBuilder sb = new StringBuilder();
    // ... 在方法内追加字符
    System.out.print(sb.toString());
  2. 异常处理:添加输入验证
    if (n <= 0) {
        System.out.println("高度必须为正整数");
        return;
    }
  3. 扩展性:封装打印方法,支持不同字符
    void printDiamond(int n, char symbol) { ... }

常见问题解决

  • 菱形不对称:确保总行数为奇数
  • 多行合并:检查换行符println()是否遗漏
  • 首尾行异常:验证innerSpace>0的条件判断

引用说明:本文代码逻辑基于空间几何对称性原则实现,参考《Java编程思想》中循环控制结构的最佳实践,算法通过数学关系式动态计算空格位置,避免硬编码提升可扩展性。

0