您的位置:首页 > 职场人生

剑指0ffer面试题3:二维数组中的查找

2016-07-21 12:32 393 查看
[align=left]//*******************************二维数组中查找一个数**********************************[/align]
[align=left]//题目要求:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的[/align]
[align=left]//          顺序排序,请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数[/align]
[align=left]//          找到则返回true,没找到则返回false[/align]
[align=left]//题目扩展:如果在找到之后还要返回它的地址,如果在数组中有多个相同的值,则需要问清楚面试官是把所有[/align]
[align=left]//          的值都返回还是第一个找到的数,或者是返回第二个找到的。[/align]
[align=left]//NOTE:(1)如何传二维数组作为函数参数:二维数组可以当作一维数组传给函数[/align]
[align=left]//      (2)如何把二维数组的下标转换为一维数组下标的格式:[/align]
[align=left]//           对于n*n的二维数组arr[当前行数][当前列数]=arr[当前行数*n+当前列数][/align]
[align=left]//           arr[0][3]=arr[0*4+3]=arr[3][/align]
[align=left]//           arr[1][3]=arr[1*4+3]=arr[7][/align]
[align=left]//           arr[2][2]=arr[2*4+2]=arr[10][/align]
[align=left]//解题思路:从右上角开始找,如果比key值大,则直接忽略掉这一列,从前一行再找,当找到的某一列的第一个数[/align]
[align=left]//         比key值小的时候,就要从下一行找[/align]
[align=left]#include<iostream>[/align]
using
namespace
std;
[align=left]
[/align]
bool
FindKey(int
*arr,
int
row,
int col,
int
key)
[align=left]{[/align]
[align=left]       [/align]
       if
(arr
!=
NULL &&
row > 0 &&
col > 0)
[align=left]       {[/align]
              int
newrow = 0;
              int
newcol =
col - 1;
           
  //判断进入循环的条件在书上是做了继续优化的,但是对于基础不好的,我还是建议做这种比较保险的
              while
(newrow >= 0 && newcol >= 0 && newrow <
row && newcol <
col)
[align=left]              {[/align]
                     if
(arr[newrow*col
+ newcol]>key)
[align=left]                     {[/align]
[align=left]                           --newcol;[/align]
[align=left]                     }[/align]
                     else
if
(arr[newrow*col
+ newcol] <
key)
[align=left]                     {[/align]
[align=left]                           ++newrow;[/align]
[align=left]                     }[/align]
[align=left]                     else[/align]
[align=left]                     {[/align]
                           return
true;
[align=left]                     }[/align]
[align=left]              }[/align]
[align=left]       }[/align]
[align=left]       [/align]
       return
false;
[align=left]}[/align]
int
main()
[align=left]{[/align]
       int
arr[4][4] = { { 1, 2, 8, 9 }, { 2, 4, 9, 12 }, { 4, 7, 10, 13 }, { 6, 8, 11, 15 } };
[align=left]       //bool ret=FindKey((int*)arr, 4, 4, 7);[/align]
       bool
ret = FindKey((int*)arr, 4, 4, 16);
[align=left]       cout << ret << endl;[/align]
[align=left]  [/align]
       return
0;
[align=left]}[/align]
[align=left]
[/align]
[align=left]
[/align]


下面给出这个题可能会出现的错误,基础不好的一定要注意这些问题
[align=left]错误!!一些基本的错误,这些错误一定要避免,数组要判空,传入的参数也要判断是否符合我们想要的[/align]
[align=left]//bool FindKey(int arr[], int row, int col, int key)[/align]
[align=left]//{[/align]
[align=left]//     //错误3::未判断数组是否为空,col和row是否是我们需要的,比如row若为-1就是错的[/align]
[align=left]//     int newrow = 0;[/align]
[align=left]//[/align]
[align=left]//     //错误2:3不是已知的,而是算出来的[/align]
[align=left]//     int newcol = 3;[/align]
[align=left]//     [/align]
[align=left]//     //错误1:刚进来时newrow=0,不满足条件,直接返回false,太粗心[/align]
[align=left]//     while (newrow > 0 && newcol > 0 && newrow < row && newcol < col)[/align]
[align=left]//     {[/align]
[align=left]//            if (arr[newrow*col + newcol]>key)[/align]
[align=left]//            {[/align]
[align=left]//                   --newcol;[/align]
[align=left]//            }[/align]
[align=left]//            else if (arr[newrow*col + newcol] < key)[/align]
[align=left]//            {[/align]
[align=left]//                   ++newrow;[/align]
[align=left]//            }[/align]
[align=left]//            else[/align]
[align=left]//            {[/align]
[align=left]//                   return true;[/align]
[align=left]//            }[/align]
[align=left]//     }[/align]
[align=left]//     return false;[/align]
[align=left]//}[/align]


下面给出解题思路的示意图:


 



  




[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
[align=left]
[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息