首页 > 其他 > 详细

面试题二 二维数组中的查找

时间:2014-02-28 17:17:43      阅读:367      评论:0      收藏:0      [点我收藏+]

题目

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

误区

  对于这道题,很多人从一般的角度思考解决方法:比如想到若数组检索对象大于该整数,则可以剔除该元素右下方的所有元素;若数组检索对象小于该整数,则可以剔除该元素左上方的所有元素。

  可是然后呢?很多人就在这里卡住了。因为剔除后的区域遍历起来太过复杂,一时半刻谁也想不出来。

正解

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

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

  1  2  8  9

  2  4  9  12

  4  7  10 13

  6  8  11 15

  中检索是否存在数字7。

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

  1. 在检索9的时候,因为7小于9,故可剔除第四列。

  2. 在检索8的时候,因为7小于8,故可剔除第三列。

  3. 在检索2的时候,因为2小于7,故可剔除第一行。

  4. 在检索4的时候,因为4小于7,故可剔除第二行。

  5. 检索到7,返回。

实现代码( 含测试 )

bubuko.com,布布扣
 1 #include <iostream>
 2 
 3 using namespace std;
 4 
 5 const int M=4;
 6 const int N=4;
 7 
 8 /*
 9  * 查找数字函数
10 */
11 bool findNum(int a[M][N], int r, int c, int num) {
12 
13     int sr =0;
14     for (int i=c-1; i>0; i--) {
15         for (int j=sr; j<r-1; j++) {
16             if (a[i][j] == num) 
17                 return 1;
18             else if (a[i][j] < num) {
19                 sr++; // 剔除当前行
20             }
21             else {
22                 break; // 剔除当前列
23             }
24         }
25     }
26 
27     return 0;
28 }
29     
30 int main(void)
31 {
32     /* 
33      * 创建一个测试用的数组并打印
34     */
35     int a[M][N] = {
36             {1, 2, 8, 9}, 
37             {2, 4, 9, 12}, 
38             {4, 7, 10,13}, 
39             {6, 8, 11,15}
40         };
41 
42     cout << "要测试的数组:";
43 
44     for (int i=0; i<M; i++) {
45         cout << endl;
46         for (int j=0; j<N; j++) {
47             if (a[i][j] >= 10) {
48                 cout << a[i][j] << " ";
49             }
50             else 
51                 cout <<a[i][j] << "  ";
52         }
53     }
54             
55     // 测试函数是否运行正常
56     cout << endl << endl << "请输入要查找的数字:";
57     int num;
58     while (cin >> num) {
59         if (findNum(a, M, N, num)) {
60         cout << "该数存在" << endl;
61         }
62         else {
63             cout << "该数不存在" << endl;
64         }
65         cout << endl << "请输入要查找的数字:";
66     }
67 
68     return 0;
69 }
bubuko.com,布布扣

小结

  1. 一定要加强编程实践能力

  2. 别急着写代码,要做深刻的思考,有主体思路之后再写代码。

面试题二 二维数组中的查找,布布扣,bubuko.com

面试题二 二维数组中的查找

原文:http://www.cnblogs.com/scut-fm/p/3572398.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!