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

Java实现螺旋钻石字符图案求助:输入3与字符串abcdefghijklm

解决Java中螺旋钻石图案的字符填充问题

看起来你已经搞定了星形钻石的打印,现在卡在如何按螺旋顺序填充字符对吧?我来帮你理清楚思路,一步步实现这个需求。

首先明确需求细节:

  • 输入n=3时,字符串长度为n² + (n-1)² = 13,刚好对应你给出的abcdefghijklm(a到m共13个字符)
  • 输出的钻石结构共2n-1=5行,每行列数依次为1→3→5→3→1,字符按指定螺旋路径填充

核心思路拆解

  1. 构建钻石网格:创建二维数组存储每个位置的字符,初始用空格占位,方便后续对齐打印。
  2. 生成螺旋位置序列:定义螺旋路径的移动顺序,生成钻石所有位置的访问顺序列表。
  3. 填充并打印网格:按螺旋顺序将字符串字符填充到网格,最后添加对齐空格并打印每行内容。

Java代码实现

import java.util.ArrayList;
import java.util.List;

public class SpiralDiamond {
    static class Position {
        int row;
        int col;
        Position(int row, int col) {
            this.row = row;
            this.col = col;
        }
    }

    public static void main(String[] args) {
        int n = 3;
        String input = "abcdefghijklm";
        char[] chars = input.toCharArray();
        int totalRows = 2 * n - 1;

        // 生成螺旋顺序的位置列表
        List<Position> spiralPositions = generateSpiralPositions(n);

        // 初始化钻石网格,用空格填充
        char[][] diamond = new char[totalRows][];
        for (int i = 0; i < totalRows; i++) {
            int cols = 2 * Math.min(i, totalRows - 1 - i) + 1;
            diamond[i] = new char[cols];
            for (int j = 0; j < cols; j++) {
                diamond[i][j] = ' ';
            }
        }

        // 按螺旋顺序填充字符
        for (int i = 0; i < spiralPositions.size(); i++) {
            Position pos = spiralPositions.get(i);
            diamond[pos.row][pos.col] = chars[i];
        }

        // 居中对齐打印钻石
        for (char[] row : diamond) {
            int padding = (2 * n - 1 - row.length) / 2;
            System.out.print(" ".repeat(padding));
            System.out.println(new String(row));
        }
    }

    private static List<Position> generateSpiralPositions(int n) {
        List<Position> positions = new ArrayList<>();
        int totalRows = 2 * n - 1;
        int mid = totalRows / 2;

        // 1. 左列向上:从中间行到顶部行,每行左列
        for (int row = mid; row >= 0; row--) {
            positions.add(new Position(row, 0));
        }

        // 2. 右列向下:从顶部下一行到中间行,每行右列
        for (int row = 1; row <= mid; row++) {
            int cols = 2 * Math.min(row, totalRows - 1 - row) + 1;
            positions.add(new Position(row, cols - 1));
        }

        // 3. 右下到左下:从中间下一行到底部行,逐步左移
        for (int row = mid + 1; row < totalRows; row++) {
            int cols = 2 * Math.min(row, totalRows - 1 - row) + 1;
            int col = cols - 1 - (row - mid);
            positions.add(new Position(row, col));
        }

        // 4. 左列向上:从底部上一行到中间下一行,每行左列
        for (int row = totalRows - 2; row > mid; row--) {
            positions.add(new Position(row, 0));
        }

        // 5. 中间行横向:从左数第二列到右数第二列
        int midCols = 2 * mid + 1;
        for (int col = 1; col < midCols - 1; col++) {
            positions.add(new Position(mid, col));
        }

        // 6. 内层中间行:第二行和倒数第二行的中间列
        positions.add(new Position(1, 1));
        positions.add(new Position(3, 1));

        // 7. 中心位置
        positions.add(new Position(mid, midCols / 2));

        return positions;
    }
}

代码说明

  • 位置生成函数:generateSpiralPositions分7个阶段生成螺旋路径的位置,完全匹配你给出的输出顺序。
  • 网格对齐:打印时通过计算每行的前置空格,让钻石图案居中显示,更符合视觉效果。
  • 扩展性:如果需要调整螺旋方向或起始点,只需修改generateSpiralPositions中的位置添加顺序即可。

运行代码后会输出:

c
 bjd
aimke
 hlf
  g

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:32:40