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

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

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

本人解法:

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

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


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

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

上一篇:vs2008 编译驱动


下一篇:SqlIte数据库并发性