【问题标题】:I am trying to search my java multidimensional array from top left to bottom right going in a vertical pattern. What is wrong with the code I have?我正在尝试以垂直模式从左上角到右下角搜索我的 java 多维数组。我的代码有什么问题?
【发布时间】:2014-10-08 21:33:01
【问题描述】:

我正在尝试以垂直模式从左上角到右下角搜索我的多维数组,它是一个 6x8 网格,但我无法弄清楚我的代码有什么问题。谁能告诉我我做错了什么?

      public static String findTopToBottom (char[][]board, String word) {
        char[] letters = word.toCharArray();

        for (int i = 0; i <= board[i].length; i++) {
            for (int j = 0; j <= board.length; j++) {
                boolean found = true;

                for (int k = 0; k < letters.length; k++) {
                    if ((i + k > board[j].length) || (letters[k] != board[j][i+k])) {
                        found = false;
                        break;
                    }
                }

                if (found) {
                    return "String " + word + " found in row=" + i + " col=" +j;
                }
            }
        }
        return "String " + word + " not found";
    }

【问题讨论】:

  • 你能描述一下它是怎么错的吗?
  • 它根本不工作,我得到一个索引越界错误。
  • 在你的第二个循环中,board.length 可能不是你想要的,因为它是一个二维数组。
  • @JesseJ 不,那是错误的,因为他故意试图以不寻常的顺序遍历数组,我认为:先向下每一列,而不是先遍历每一行。

标签: java search multidimensional-array traversal


【解决方案1】:
if ((i + k > board[j].length) || (letters[k] != board[j][i+k])) {

如果i + k 等于board[j].length,将抛出一个越界异常,因为索引只从0 到.length - 1。使用&gt;= 而不是&gt;

同理,下面的&lt;=需要改成&lt;

    for (int i = 0; i <= board[i].length; i++) {
        for (int j = 0; j <= board.length; j++) {

因为最大可能索引为.length - 1

还有这个:

    for (int i = 0; i <= board[i].length; i++) {

即使在将 &lt;= 更改为 &lt; 之后,也只是看起来不对。 i 索引应该是数组中列的索引,但是当您说 board[i].length 时,您将 i 视为行索引。这不会导致 6x8 数组出现问题,但会导致 8x6 数组出现问题,例如,因为您希望 i 从 0 变为 7,但是当 i=6 时,board[6].length 将超出范围。如果您确定所有行的长度相同,则应将其更改为

    for (int i = 0; i < board[0].length; i++) {

【讨论】:

    【解决方案2】:

    检查我的解决方案:

    public static String findTopToBottom(char[][] board, String word) {
        char[] letters = word.toCharArray();
    
        if (letters.length <= board.length) {
            int lettersIndex = 0;
    
            for (int r = 0; r < board.length; r++) {
    
                // scan horizontally
                for (int c = 0; c < board[r].length; c++) {
                    if (board[r][c] == letters[0]) {
                        // found first letter now scan vertically
                        lettersIndex++;
    
                        // now go down
                        for (int r1 = r+1; r1 < board.length; r1++) {
                            if (c < board[r1].length && board[r1][c] == letters[lettersIndex]) {
                                lettersIndex++;
    
                                if (lettersIndex == letters.length) {
                                    return "String " + word + " found in row=" + r + " col=" + c;
                                }
                            } else {
                                // no break it
                                lettersIndex = 0;
                                break;
                            }
                        }
    
                    }// found first
                }
            }
        }
    
        return "String " + word + " not found";
    }
    

    它可以在任何类型的数组中工作。

    所以我的算法步骤是:

    1. 水平扫描每一行
    2. 如果找到单词的第一个字母,请垂直扫描
      1. 如果在垂直扫描期间相等性失败停止并继续最后一次水平扫描。
      2. 如果您发现 单词 的所有字母连续相等,则返回成功。

    【讨论】:

      猜你喜欢
      • 2014-12-04
      • 2014-12-03
      • 2014-12-05
      • 2019-07-10
      • 2022-11-28
      • 1970-01-01
      • 1970-01-01
      • 2021-02-21
      • 2021-12-21
      相关资源
      最近更新 更多