【问题标题】:How would I create this loop that examines integers in an array?我将如何创建这个检查数组中整数的循环?
【发布时间】:2014-11-26 17:54:03
【问题描述】:

我正在做的是创建一个具有一定数量的行和列的矩阵,我用 0 到 9 范围内的随机整数填充该表。我现在要做的是确定是否存在连续的偶数在表中相邻重复四次的整数。例如,这样的事情:

2 5 8 7 1
3 2 9 4 7
5 1 2 0 3
8 0 1 2 7

在该表中,两个从第一个点沿对角线连续出现。也可以是这样的:

9 5 3 7 0
2 5 7 3 1
8 5 0 2 9
4 5 1 7 5

在此表中,五个从第二个位置垂直向下显示。

我已经创建了如下所示的二维数组:

public static void main(String[] args) {
    int[][] randomTable = new int[5][5];
    for (int row = 0; row < randomTable.length; row++) {
        for (int column = 0; column < randomTable[row].length; column++) {
            randomTable[row][column] = (int)(Math.random() * 10 + 0);
            System.out.print(randomTable[row][column] + " ");
        }
        System.out.println();
    }       
}

在测试数组时,如果数组包含我上面详述的那四个连续的偶数,我需要它返回 true。我知道我需要创建一个循环,但我该怎么做呢?

【问题讨论】:

  • 您是否已经尝试过?显示一些代码
  • @Michael 我还没有构建循环,但我正在考虑它,我相信我需要通过每一行和每一列创建一个嵌套循环,当它找到什么时将终止我在找。
  • 如果您创建一个包含 4 个元素的数组并在其中保存连续数字并检查它们会怎样(对于较大的随机数组可能效率极低)
  • 代码将创建一个 5x5 矩阵,但您的示例是 5x4 ?
  • @Michael,我认为这与解决方案无关,但很好的观察

标签: java arrays


【解决方案1】:

我可能会考虑对此进行递归处理。

您知道四个“匹配”可能是上、下、左、右和对角线的两个方向。这在很大程度上是低效的,但我首先想到的是:

randomTable[][] 中的每个int 上调用一个方法check(int value, int j, int i, int deltaJ, int deltaI, int count);

循环遍历整个随机数数组的循环:

for (int i = 0; i < randomTable.length; i++) {
    for (int j = 0; j < randomTable[i].length; j++) {
        boolean a = check(randomTable[i][j], j, i, 1, 0, 1); // move right 
        System.out.print(a ? "The number " + randomTable[i][j] + "is in a line!" : );
    }
}

然后,递归循环可能看起来像这样:

boolean check(int value, int j, int i, int deltaJ, int deltaI, int count) {
    if (count == 4) {
        return true;
    }

    try {
        if (randomTable[i + deltaI][j + deltaJ] == value) {
            return check(randomTable[i + deltaI][j + deltaJ], j + deltaJ, i + deltaI, deltaJ, deltaI, count + 1);
        } else {
            return false;
        }
    } catch (ArrayIndexOutOfBoundsException e) {
        return false;
    }
}

【讨论】:

    【解决方案2】:

    我会尝试递归。从左上角开始。如果找到偶数,则递归调用一个跟踪计数的方法,只能在该行或下一行中向左看。

    递归签名可能是:

      int getMaxSameNeibors(int valueToMatch, int numberFoundSoFar,
            int[][] array, int currentIndex0, int currentIndex1){
    
      }
    

    挑战如下:

    2 5 8 7 1
    3 2 9 4 7
    2 2 2 0 3
    8 0 1 5 7
    

    有 5 个相邻的“2”,但不要重复计算 2,3 处的那个,因为它是 2,2 和 3,1 的邻居。为此,您可能需要将找到的位置列表传递给递归。

    编辑

    我意识到这不适用于以下...

    2 5 8 7 1
    3 2 2 2 7
    3 3 2 0 3
    8 0 1 5 7
    

    因此,您需要检查同一行右一、右上一排和右下一排(左 1、2 正下方和右 1)。因此,我认为您需要传递找到的值索引列表。

    【讨论】:

      【解决方案3】:

      想一想,您希望您的测试何时返回 true?如果有偶数连续出现在一行、一列或对角线。如果它们都出现在同一行中,则它们具有相同的行号和连续的列号。

      同样,如果它们出现在同一列中,则它们具有相同的列和连续的行。通过扩展,您认为您会如何处理表格的对角线?

      【讨论】:

        【解决方案4】:

        James Taylor 的回答可能是最好的,但也非常复杂。如果您的矩阵始终为 5x5,则:

        对于每一行或每一列:元素 1、2 和 3 必须相同才能成为“命中”。检查此项,如果是,请检查元素 0 或 4 是否也是该数字。如果再这样,你就成功了

        这将是 2 个相当简单的循环!

        那么你需要另外两个循环来处理从左上到右下和从右上到左下的对角线。两种变体都可以容纳 4 次可能的命中。这些循环也不太复杂

        如果您的矩阵可以是动态大小,则使用递归或创建始终检查当前数字和以下 3 的循环

        【讨论】:

          【解决方案5】:

          我会编写一个方法来检查给定方向上给定数字的序列,由dx(方向x)和dy(方向y)参数给出:

          boolean checkSequence(int[][] table, int number, int x, int y, int dx, int dy) {...}
          

          然后你只需要确定有哪些方向,哪些位置有足够的空间容纳该方向的序列,并检查它们是否有所有偶数。代码如下:

          import java.util.Arrays;
          
          public class Sequence
          {
              // which axis is x and y and in which direction depends on your own preference,
              // just need to be consistent (applies to the whole program)
              static final int[][] directions = {{1,0},{1,1},{0,1}};
          
              static final boolean checkSequence(int[][] table, int number, int x, int y, int dx, int dy)
              {
                  for(int i=0;i<4;i++) {if(table[y+dy*i][x+dx*i]!=number) return false;}
                  return true;
              }
          
              public static void main(String[] args)
              {
                  while(true)
                  {
                      int[][] randomTable = new int[5][5];
                      for (int row = 0; row < randomTable.length; row++)
                      {
                          for (int column = 0; column < randomTable[row].length; column++)
                          {
                              randomTable[row][column] = (int)(Math.random() * 10 + 0);
                          }
                      }
                      for(int d=0;d<directions.length;d++)
                      {
                          int dx = directions[d][0];
                          int dy = directions[d][1];
                          // determine starting points where you have enough space to allow for a sequence at least 4 numbers long
                          for(int y=0;y<randomTable.length-dy*3;y++)
                          {
                              for(int x=0;x<randomTable[y].length-dx*3;x++)
                              {
                                  for(int i=0;i<=10;i+=2)
                                  {
                                      if(checkSequence(randomTable, i, x, y,dx,dy))
                                      {
                                          for (int row = 0; row < randomTable.length; row++)
                                          {
                                              for (int column = 0; column < randomTable[row].length; column++)
                                              {
                                                  System.out.print(randomTable[row][column] + " ");
                                              }
                                              System.out.println();
                                          }
          
                                          System.out.println("Heureka! Found sequence of number "+i+
                                                  " at position "+x+","+y+" in direction "+dx+" "+dy);
                                          return;
                                      }
                                  }
                              }
                          }
                      }
                  }
              }
          }
          

          【讨论】:

            猜你喜欢
            • 2012-04-26
            • 2015-05-09
            • 1970-01-01
            • 2011-07-19
            • 1970-01-01
            • 2017-03-17
            • 2019-05-26
            • 2015-06-17
            • 1970-01-01
            相关资源
            最近更新 更多