一道题目的二种思路,你学到了什么?

来源:互联网 发布:淘宝五金店铺知乎 编辑:程序博客网 时间:2024/05/03 06:54

面试中,面试官经常会考察的要点,就是应试者的思路。而本文,介绍了笔者看到这个面试题后的思路,以及书本给出的更好的思路的比较,给出简要分析和总结。

题目:在一个二维数组中,每一行从左到右递增排列,每一列自上而下递增排列。请完成函数,完成数组中特定数的   查找,判断数组中是否存在该整数。

本人解法:

#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,直至循环结束。

特点:思维缜密,使用了题目的两个条件,复杂度可观,算法巧妙。


  因而,面试时,望深入思考,尽可能使用题目所有可用有利条件,这样你的算法会更好,复杂度会更低,算法会更加灵活,吸引眼球。

0 0