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

Java实现单词三角形打印问题求助及优化方案咨询

解决单词三角形打印的问题

嘿,我来帮你梳理下问题~你的代码思路方向是对的,但核心问题出在substring的索引计算上,还有循环逻辑没覆盖完整的三角形(只打印了上半部分)。咱们一步步来修正和优化:

你的代码问题点

对于"mathematics"(长度11,中间字符索引是5),你第一次循环i=0时,substring(n-1, n+i+1)也就是substring(4,6),取到的是"he",而不是我们需要的单个中间字符"e",这直接导致了起始行就错了。另外,你的循环只处理了从中间到右侧的扩展,没处理下半部分的收缩,所以最后只会打印三角形的上半段。

优化后的解决方案

我们可以调整逻辑:以单词的中间字符为对称中心,先从中心向外扩展打印上半部分,再从倒数第二行收缩打印下半部分。另外,Java 11及以上版本有原生的String.repeat()方法,不用自己实现重复字符串,既简洁又高效。

public static void main(String[] args) {
    String word = "mathematics";
    int wordLength = word.length();
    int midIndex = wordLength / 2; // 找到中间字符的索引

    // 打印三角形上半部分(包含中间的完整行)
    for (int step = 0; step <= midIndex; step++) {
        // 打印前置空格:随着step增加,空格数递减
        System.out.print(" ".repeat(midIndex - step));
        // 截取从mid-step到mid+step+1的子串(左闭右开,刚好包含左右扩展的字符)
        System.out.println(word.substring(midIndex - step, midIndex + step + 1));
    }

    // 打印三角形下半部分(从倒数第二行开始收缩)
    for (int step = midIndex - 1; step >= 0; step--) {
        System.out.print(" ".repeat(midIndex - step));
        System.out.println(word.substring(midIndex - step, midIndex + step + 1));
    }
}

代码细节解释

  • 中间索引定位:midIndex = wordLength / 2,对于奇数长度的单词(比如11),刚好指向正中间的字符;如果是偶数长度(比如"worlds"是6个),midIndex是3,会以第3和第4个字符为对称点,打印出来的三角形也会对称。
  • 前置空格控制:" ".repeat(midIndex - step)保证每行的缩进随着扩展步数增加而减少,形成三角形的左对齐效果。
  • 子串截取逻辑:substring(midIndex - step, midIndex + step + 1),当step=0时,截取的是[mid, mid+1),也就是单个中间字符;step=1时,截取[mid-1, mid+2),包含中间字符左右各一个,以此类推,完美实现向外扩展的效果。
  • 下半部分循环:从midIndex-1倒序到0,重复上半部分的逻辑,这样就能打印出完整的对称三角形。

兼容低版本Java的小技巧

如果你的Java版本低于11,没有String.repeat(),可以用下面的方式替代空格生成:

// 替代" ".repeat(midIndex - step)
System.out.print(new String(new char[midIndex - step]).replace('\0', ' '));

或者保留你自己的repeat方法,但原生方法的性能会更好哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:30:19