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

如何判断单词能否完整放入二维数组?数组越界问题求助

解决二维数组添加单词的越界问题

原代码存在的问题

  1. 越界判断逻辑错误:
    • 水平添加(position=0)时,用y + 1 >= board[x].length逐个字符判断的时机不对,且未提前校验整个单词的放置范围是否超出列数,导致部分字符直接丢失。
    • 垂直添加(position=1)时,错误使用board[y].length获取行数,应该直接使用总行数rows;同时同样未提前校验单词整体的行范围。
  2. 无效处理逻辑:遇到越界仅用continue跳过,没有提前阻止无效添加,导致单词不完整。

解决方案

新增有效性校验方法,在添加单词前先判断是否能完整放入数组;同时修正原代码的逻辑错误,确保只有校验通过时才执行添加操作。

修改后的完整代码

public class WordSearch {

    private static final int ROWS = 5;
    private static final int COLUMNS = 10;
    private char[][] board = new char[ROWS][COLUMNS];

    public WordSearch() {
        // 初始化二维数组为*
        for (int row = 0; row < ROWS; row++) {
            for (int col = 0; col < COLUMNS; col++) {
                board[row][col] = '*';
            }
        }
    }

    // 校验单词是否可以从(x,y)位置按指定方向完整放入
    private boolean canAddWord(String word, int position, int x, int y) {
        if (word == null || word.isEmpty()) {
            return false;
        }
        int wordLength = word.length();
        // 先校验起始坐标是否在数组合法范围内
        if (x < 0 || x >= ROWS || y < 0 || y >= COLUMNS) {
            return false;
        }
        switch (position) {
            case 0: // 水平方向(从左到右)
                // 检查单词末尾列是否超出数组总列数
                return y + wordLength <= COLUMNS;
            case 1: // 垂直方向(从上到下)
                // 检查单词末尾行是否超出数组总行数
                return x + wordLength <= ROWS;
            default:
                return false;
        }
    }

    public void addWord(String word, int position, int x, int y) {
        // 先执行有效性校验,不合法直接提示并返回
        if (!canAddWord(word, position, x, y)) {
            System.out.println("无法添加单词:位置越界或方向无效");
            return;
        }

        int wordLength = word.length();
        switch (position) {
            case 0: // 水平添加
                for (int i = 0; i < wordLength; i++) {
                    board[x][y + i] = word.charAt(i);
                }
                break;
            case 1: // 垂直添加
                for (int i = 0; i < wordLength; i++) {
                    board[x + i][y] = word.charAt(i);
                }
                break;
            default:
                System.out.println("请输入0(水平)或1(垂直)指定添加方向");
        }
    }

    // 打印二维数组,方便查看结果
    public void printBoard() {
        for (char[] row : board) {
            System.out.println(new String(row));
        }
    }

    public static void main(String[] args) {
        WordSearch ws = new WordSearch();
        // 尝试在(2,5)位置水平添加"schedule"(5+8=13>10,会提示无法添加)
        ws.addWord("schedule", 0, 2, 5);
        // 在(1,2)位置水平添加"schedule"(2+8=10,刚好可以放入)
        ws.addWord("schedule", 0, 1, 2);
        ws.printBoard();
    }
}

关键修改说明

  • 把rows和columns改为私有常量(符合Java命名规范),增强封装性。
  • 新增canAddWord方法,从三个维度校验:单词非空、起始坐标合法、单词整体放置后不越界。
  • 修改addWord方法,先执行校验,不合法直接终止操作并提示;校验通过后直接按位置填充字符,避免循环中的错误判断。
  • 新增printBoard方法,方便直观查看数组内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 00:45:44