zoukankan      html  css  js  c++  java
  • 二维数组中的查找

    题目

      在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。

    问题分析

      

     应当从具体问题入手,通过分析简单具体的例子,发现普遍的规律。

      现在假定,我们要从二维数组

      1  7  14  21

      3  8  15  22

      5  9  16  23

      7  17 23 24

      中检索是否存在数字7。

      按照从右上方,列优先的顺序检索该数组。

      1. 在检索17的时候,因为21大于17,故可剔除第四列。

      2. 在检索14的时候,因为14小于17,故可剔除第一行,相当于更新行号和列号后重新执行而已。则剩下

                 3  8  15  

                 5  9  16  

                 7  17 23

         3. 在检索15的时候,因为15小于17,故可剔除第一行,只剩下

                   5  9  16  

                 7  17 23

         4. 在检索16的时候,因为16小于17,故可剔除第一行,只剩下

                   7  17 23

      5. 在检索到23的时候,因为23大于17,故可剔除第三列,只剩下

                     7   17

         6. 检索到17,返回。

    代码实现如下:

    #include <stdio.h>
    #define M 4
    #define N 4
    int FindNumber(int array[M][N],int rows,int columns,int number)
    {
        if(array!=NULL && rows>0 && columns>0)
            {
                int col=columns-1,row=0;
                while(col>=0 && row<rows)
                {
                    if(array[row][col]>number)
                       {
                          col--;
                          continue;
                       }
                    else if(array[row][col]<number)
                    {
                          row++;
                          continue;
                    }
                    else
                            return 1;
                }
                return 0;
    
            }
        else
                return 0;
    }
    
    
    int main(void)
    {
        int a[M][N]={
          {1,7,14,21},{3,8,15,22},{5,9,16,23},{7,17,23,24}
        };
        int num;
        printf("要测试的数组为:
    ");
        for(int i=0;i<M;i++)
        {
                for(int j=0;j<N;j++)
                {
                        printf("%d ",a[i][j]);
                }
                printf("
    ");
        }
        printf("请输入要查找的数:");
        while(scanf("%d",&num))
        {
               if(FindNumber(a,M,N,num))
                       printf("该数存在
    ");
               else
                       printf("该数不存在
    ");
               printf("请输入要查找的数:");
        }
    
        return 0;
    }

    结果如下:

    $ ./MyFindNumberInTwoArrays.exe
    要测试的数组为:
    1 7 14 21
    3 8 15 22
    5 9 16 23
    7 17 23 24
    请输入要查找的数:17
    该数存在
    请输入要查找的数:23
    该数存在
    请输入要查找的数:22
    该数存在
    请输入要查找的数:10
    该数不存在
    请输入要查找的数:6
    该数不存在
    请输入要查找的数:

     程序猿必读

  • 相关阅读:
    java Activiti 工作流引擎 SSM 框架模块设计方案
    自定义表单 Flowable 工作流 Springboot vue.js 前后分离 跨域 有代码生成器
    数据库设计的十个最佳实践
    activiti 汉化 stencilset.json 文件内容
    JAVA oa 办公系统模块 设计方案
    java 考试系统 在线学习 视频直播 人脸识别 springboot框架 前后分离 PC和手机端
    集成 nacos注册中心配置使用
    “感恩节 ”怼记
    仓颉编程语言的一点期望
    关于System.out.println()与System.out.print("\n")的区别
  • 原文地址:https://www.cnblogs.com/longzhongren/p/4338946.html
Copyright © 2011-2022 走看看