面试题之二维数组中的查找
2016-04-13 20:50
381 查看
题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
例如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如果查找数字7,则返回true,如果查找数字5,则返回false.
对于这道题主要考察二维数组的存储,二维数组在内存中是一维存储,从上到下存储各行元素,在同一行中按照左向右的顺序存储。因此可以根据行号和列号计算出数组首地址的偏移量,从而可以找到对应的元素。
该题的大致思路就是从最后一列向前进行比较,找到比key小的之后从行的上面向下遍历。。。
下面给出具体的代码:
其执行结果:
例如:
1 2 8 9
2 4 9 12
4 7 10 13
6 8 11 15
如果查找数字7,则返回true,如果查找数字5,则返回false.
对于这道题主要考察二维数组的存储,二维数组在内存中是一维存储,从上到下存储各行元素,在同一行中按照左向右的顺序存储。因此可以根据行号和列号计算出数组首地址的偏移量,从而可以找到对应的元素。
该题的大致思路就是从最后一列向前进行比较,找到比key小的之后从行的上面向下遍历。。。
下面给出具体的代码:
#include<iostream> #include<stdlib.h> using namespace std; #define N 4 bool Iskey_exist(int *a,int rows,int cols,int key) { bool found = false; if(a != NULL && rows > 0 && cols > 0){ int row = 0; int col = cols - 1; while(row < rows && col >= 0){ if(a[row * cols + col] == key){ found = true; break; }else if(a[row * cols + col] > key){ --col; }else{ ++row; } } } return found; } int main(int argc,char**argv) { int a ; int key; cout << "please input elements:"<<endl; for(int i = 0;i < N; ++i){ for(int j = 0;j < N ;++j){ cin >> a[i][j]; } } while(1){ cout << "please input key:(-1 == quit) "<<endl; cin >> key; if(key == -1){ cout << "error!!" << endl; exit(1); } if(Iskey_exist((int *)a,N,N,key)){ cout << key << " is found!!"<< endl; }else{ cout << key << " is not found !!"<<endl; } } return 0; }
其执行结果:
相关文章推荐
- 我的求职经历
- 我的求职经历
- 职业规划第四次作业
- Android面试中的一个常见问题:Layout_weight的用法
- 多态经典面试题解析
- 栈&队列的那些应用---常见面试题
- 面试题80:海量数据等概论抽样(蓄水池问题)
- 漫谈程序员(十二)IT程序猿之猿体是革命的本钱
- 漫谈程序员(十二)IT程序猿之猿体是革命的本钱
- 【笔试/面试】—— 二叉树的最远距离
- 4.11日第11次作业,21章法律法规与标准,22章职业道德规范
- 剑指offer-面试题42:翻转单词顺序VS左旋转字符串
- 12年程序员职业生涯得到的12个经验教训:转
- 360移动安全岗位实习生笔试和面试之旅
- 程序员分为哪几个类型呢?
- 11--法律法规、标准规范和职业道德
- 程序员需要具备的基本技能
- 【笔试/面试】—— 二叉树的深度和宽度
- Android&Java经典面试题
- 程序员的“非程序员”之路