• 面试题2:二维数组中的查找


    题目描述:

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

    思路分析:

         从二维数组的右上角的元素开始判断,因为此元素是它所在行的最大数,是它所在的列的最小数。如果它等于要查找的数字,则查找过程结束。如果它大于要查找的数字,则可以排除它所在的列。如果它小于要查找的数字,则可排除它所在的行。这样如果要查找的数字不在数组的右上角,则每次判断都可以排除一行或一列以缩小查找范围,直到找到要查找的数字,或者查找范围为空。

    下图是在二维数组中查找7的示意图:

     

     查找功能代码:

    //在rows行*columns列的二维数组p_nArray中查找nFindNum,找到返回ture, 否则返回false
    int IsFind(int *p_nArray, int rows, int columns, int nFindNum)
    {
        int found=0;
    
        if (p_nArray!=NULL && rows>0 && columns>0)
        {
            int row = 0;
            int column = columns - 1;
    
            while (row<rows && column>=0)  //对于二维数组,行指针加1跳过一行,列指针加1跳过一个元素
            {            
                if (*(p_nArray + row*columns + column) == nFindNum)
                {
                    found=1;
                    break;
                }
                else if (*(p_nArray + row*columns + column) > nFindNum)
                    --column;
                else
                    ++row;
            }
        }
        return found;    
    }

    测试代码:

    int main()
    {
        int nArr[4][4] =
        {
            {1, 2, 8, 9},
            {2, 4, 9, 12},
            {4, 7, 10, 13},
            {6, 8, 11, 15}
        };
    
        int flag=0;
        int m;
        printf("请输入要查找的数据:");
        scanf("%d",&m);
        flag= IsFind(*nArr, 4, 4, m);
        if(flag==1)
            printf("查找成功!
    ");
        else
            printf("查找失败!
    ");
    
        system("pause");
        return 0;
    }

    测试结果:

       

     

  • 相关阅读:
    Linux 性能监测:CPU
    Linux 性能监测:介绍
    数据库设计
    数据库设计
    如何将Virtualbox和VMware虚拟机相互转换
    如何将Virtualbox和VMware虚拟机相互转换
    stat()获得文件信息
    stat()获得文件信息
    网游创业为什么会失败?
    网游创业为什么会失败?
  • 原文地址:https://www.cnblogs.com/kkdd-2013/p/3353393.html
Copyright © 2020-2023  润新知