美文网首页
模式识别:连续四个相同数字(二维数组)

模式识别:连续四个相同数字(二维数组)

作者: 五秋木 | 来源:发表于2017-10-10 01:04 被阅读0次

1. 题目:

测试一个二维数组是否存在四个连续的数字具有相同的数值,在水平方向、垂直方向和正反对角线方向判断。
函数:public static boolean isConsecutiveFour(int [][] values)
编写一个测试程序,提示用户输入一个二维数组的行数,列数以及矩阵,若存在四个连续相同的数字就显示true,否则,false。
测试用例:

用例1
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 6 2 1 8 2 9
6 5 6 1 1 9 1
1 3 6 1 4 0 7
3 3 3 3 4 0 7

用例2
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 5 2 1 8 2 9
6 5 6 1 1 9 1
1 5 6 1 4 0 7
3 5 3 3 4 0 7

用例3
0 1 0 3 1 6 1
0 1 6 8 6 0 1
5 6 2 1 6 2 9
6 5 6 6 1 9 1
1 3 6 1 4 0 7
3 6 3 3 4 0 7

用例4
0 1 0 3 1 6 1
0 1 6 8 6 0 1
9 6 2 1 8 2 9
6 9 6 1 1 9 1
1 3 9 1 4 0 7
3 5 3 9 4 0 7

2. 方法一

依次按照行、列、反对角线、正斜对角线
其中对行处理代码如下:

public static boolean isRowConsecutiveFour(int [][]values)
    {
        //row
        int count;
        for(int i=0;i<values.length;i++)
        {
            count=1;
            for(int j=1;j<values[i].length;j++)
            {
                if(values[i][j]==values[i][j-1])
                    count++;
                else
                    count=1;
                if(count==4)
                    return true;
            }
        }
        return false;
    }

于是列的处理就变成把矩阵转置之后直接对行处理即可
对于反斜对角线的处理:


2.png

从行+列的和开始,和为3的直线正好是左上角的第一组反斜线,下面的斜线和以此加1,直到和为row+column-2-3为止,先计算和从3到column-1的所有斜线,并且要确保数组访问不越界,后面接着计算和从column到
row+column-2-3的所有斜线。
代码如下:

public static boolean isTriConsecutiveFour(int [][]values)
    {
        int count;
        for (int k = 3; k < values[0].length; k++) {
            count = 1;
            for (int i = 1; i <= k && i < values.length; i++) {
                int j = k - i;
                if (values[i][j] == values[i - 1][j + 1])
                    count++;
                else
                    count = 1;
                if (count == 4)
                    return true;
            }
        }
        for (int k = values[0].length; k <=values[0].length+values.length-5; k++) {
            count = 1;
            for (int j=values[0].length-2; j <= k && j >= 0; j--) {
                int i = k - j;
                if(i==values.length)
                    break;
                if (values[i][j] == values[i - 1][j + 1])
                    count++;
                else
                    count = 1;
                if (count == 4)
                    return true;
            }
        }
        return false;
    }

最后对于正斜线的处理,直接将原始矩阵中元素左右互换,直接使用对反斜线处理的方法即可。

3. 方法二

对每一个元素从向右,向下,向右下,向右上以此遍历,例如从向右搜索,找该元素右边的三个元素,先判断最后一个是否越界,若越界,则向右遍历失败。若不越界,开始判断是否存在四个元素中有不相同的,若存在,则向右遍历失败。开始向下、向右下、向右上遍历。
另外将方向存到一个4*2的数组中,如下:

int [][] direction = {
                {0,1},
                {1,0},
                {1,1},
                {-1,1}
        };

判断越界函数如下:

  public static boolean isOverflowEdge(int i,int row,int j,int column)
  {
      if(i<0||i>=row||j<0||j>=column)
          return true;
      return false;
  }

向某个方向(右,下,右下,右上)遍历如下:toDirection就是方向数组direction中的某一行

public static boolean TraversalDirection(int [][]values, int i,int row,int j,int column,int[] toDirection)
  {
        boolean flag = true;
        //if(!isOverflowEdge(i-3,row,j,column))//无需向上 向左 向左上 向左下 还剩下四个方向
        //向右 向下 向右下 向右上 判断是否出界
        if(!isOverflowEdge(i+3*toDirection[0],row,j+3*toDirection[1],column))  
            {
                for(int k=0;k<3;k++)
                    {
                        if(values[i+k*toDirection[0]][j+k*toDirection[1]]!=values[i+(k+1)*toDirection[0]][j+(k+1)*toDirection[1]])
                            {
                                flag=false;
                                break;
                            }
                    }
            }
        else
            flag=false;
        return flag;
  }

相关文章

  • 模式识别:连续四个相同数字(二维数组)

    1. 题目: 测试一个二维数组是否存在四个连续的数字具有相同的数值,在水平方向、垂直方向和正反对角线方向判断。函数...

  • C语言学习 day7

    数组 一组相同类型元素的集合 一维数组在内存中是连续存放的随着数组下标的增长,地址是由低到高变化的 二维数组在内存...

  • java学习第九章(数组)

    数组 数组的循环 数字12345倒序打印 二维数组 二维数组的循环 数组找到最大值 数组的排序(冒泡算法) 变量交...

  • leetcode的每日一题更新(Range Addition I

    题目:给两个数字m,n和一个二维数组ops,两个数字代表一个二维数组,所有的元素都是0,而二维数组里每个ops[[...

  • 剑指Offer二维数组查找

    剑指Offer二维数组查找 二维数组查找 题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到...

  • 数组相同数字聚集

    题目描述: 昨天做 leetcode 组合总和 II 这个题目时,碰到这样一个需求:给定一个数组,数组中存在相同的...

  • Go语言数组、切片、映射

    数组 声明和初始化 访问指针数组的元素 相同类型(数组长度和每个数组元素类型相同)的数组变量可以互相赋值。 二维数...

  • js根据相同属性值将一个一维对象数组转为二维数组

    1 将一个一维对象数组,根据相同的属性值,转化成一个二维数组 如 按照相同的code值转换成二维数组 es6的方法...

  • LeetCode-最长重复子数组

    题目描述: 解题思路:使用二维数组能够清晰的表示出两个数组相同的部分,此处二维数组定义为 int[][] poin...

  • iOS 处理数组中相同元素

    如题:从数组中把相同元素放到一个数组中,返回一个二维数组

网友评论

      本文标题:模式识别:连续四个相同数字(二维数组)

      本文链接:https://www.haomeiwen.com/subject/huapyxtx.html