面试中,面试官经常会考察的要点,就是应试者的思路。而本文,介绍了笔者看到这个面试题后的思路,以及书本给出的更好的思路的比较,给出简要分析和总结。
题目:在一个二维数组中,每一行从左到右递增排列,每一列自上而下递增排列。请完成函数,完成数组中特定数的 查找,判断数组中是否存在该整数。
本人解法:
#include<iostream>
using namespace std;
enum{ ROW = 4, COL = 4 };
bool search_dat(int data[ROW][COL], int dat)
{
int i, j;
for (i = 0; i<ROW; i++)
{
if (dat<data[i][0] || dat>data[i][COL - 1]) continue;
for (j = 0; j<COL; j++)
if (dat == data[i][j]) return true;
if (i == ROW - 1) return false;
}
}
int main()
{
int data[ROW][COL] = { 1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15 };
int dat;
cout << "Please enter a number:";
cin >> dat;
if (search_dat(data, dat)) cout << "find it!" << endl;
else cout << "not exit!" << endl;
return 0;
}
思路:通过每行中行首和行尾两个元素,限定行,而后查找该行。
特点:简单粗暴,比较次数稳定,复杂度相对高,题目条件中列的特点几乎没有使用。
书本答案:
#include<iostream>
using namespace std;
enum{ ROW = 4, COL = 4 };
bool search_dat(int data[ROW][COL], int dat)
{
bool found = false;
int arry_row = 0;
int arry_col = COL - 1;
while (arry_row<ROW&&arry_col >= 0)
{
if (data[arry_row][arry_col] == dat)
{
found = true;
break;
}
else if (data[arry_row][arry_col]>dat)
--arry_col;
else ++arry_row;
}
return found;
}
int main()
{
int data[4][4] = { 1, 2, 8, 9, 2, 4, 9, 12, 4, 7, 10, 13, 6, 8, 11, 15 };
int dat;
cout << "Please input dat:";
cin >> dat;
if (search_dat(data, dat)) cout << "find it!" << endl;
else cout << "not exit!" << endl;
return 0;
}
约定:待查数:a 当前范围右上角数字 b。
思路:每次选取右上角数字。如果a=b,则找到。如果a<b,则可以排除b所在列,如果a>b,则可以排除b所在行。然后 重新指定b,直至循环结束。
特点:思维缜密,使用了题目的两个条件,复杂度可观,算法巧妙。
因而,面试时,望深入思考,尽可能使用题目所有可用有利条件,这样你的算法会更好,复杂度会更低,算法会更加灵活,吸引眼球。