You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java实现指定奇数高度与字符的字母菱形打印逻辑优化咨询

核心问题与修改方案

你现有代码的问题主要集中在4处:

  • 外层循环次数不足:h高度的菱形需要输出h行,你现在的循环仅执行h-2次,缺了首行和下半段所有行
  • 直接修改了用户输入的原始字符变量c,导致每行的起始字符不断偏移,输出字符不符合预期
  • 没有按中间行拆分上下半段的增减逻辑,菱形的上下半段空格、字符数的变化趋势是相反的
  • 空格计算逻辑错误,导致所有输出行整体偏右

修改后的可运行代码

import java.util.Scanner;

public class DiamondPrint {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        System.out.print("h: ");
        int h = in.nextInt();
        System.out.print("c: ");
        char c = in.next().charAt(0);

        if(h%2==0){
            System.out.println("Invalid number!");
            return;
        }

        int mid = h / 2; // 计算中间行的索引
        char originalC = c; // 保存原始输入的字符,不要修改这个值

        for (int i = 0; i < h; i++) {
            // 计算当前行前面的空格数
            int spaceNum = Math.abs(mid - i);
            for (int spc = 0; spc < spaceNum; spc++) {
                System.out.print(" ");
            }
            // 计算当前行的字符总数
            int charCount = h - 2 * spaceNum;
            // 打印字符
            for (int j = 0; j < charCount; j++) {
                // 直接计算当前位置应该输出的字符,不需要修改原始字符
                char currentChar = (char) (originalC - Math.abs(j - (charCount / 2)));
                System.out.print(currentChar);
            }
            System.out.println();
        }
        in.close();
    }
}

逻辑说明

  • 用mid存菱形中间行的索引,上下半段的空格、字符数都通过当前行索引和mid的差值计算,不需要额外的递增/递减变量维护
  • 提前保存用户输入的原始字符,每行的每个位置字符都通过偏移量直接计算,不会出现字符偏移的问题
  • 外层循环执行h次,刚好覆盖菱形的所有行,输出和你的预期完全一致

内容的提问来源于stack exchange,提问作者user4964096

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 11:18:00