面试中,面试官经常会考察的要点,就是应试者的思路。而本文,介绍了笔者看到这个面试题后的思路,以及书本给出的更好的思路的比较,给出简要分析和总结。
题目:在一个二维数组中,每一行从左到右递增排列,每一列自上而下递增排列。请完成函数,完成数组中特定数的 查找,判断数组中是否存在该整数。
本人解法:
#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,直至循环结束。
特点:思维缜密,使用了题目的两个条件,复杂度可观,算法巧妙。
因而,面试时,望深入思考,尽可能使用题目所有可用有利条件,这样你的算法会更好,复杂度会更低,算法会更加灵活,吸引眼球。