现在的位置: 首页 > 综合 > 正文

面试训练二维数组

2013年10月06日 ⁄ 综合 ⁄ 共 1251字 ⁄ 字号 评论关闭

这是海涛书上面的一道题目

感觉很有意思。

思路呢就是 根据数组的特性吧,因为右上角为行最大,列最小,那么和我们相比较的元素相比,不管如何如果大 则减列,如果小则减行。

这样不断缩小我们查询的范围,可谓是经典中的经典啊。

书中采用右上角那么我也来小试牛刀

#include "stdio.h"
int findRightBound(int **data,int rows,int cols,int key)
{
	int row;
	int col;
	
	if(rows==0||cols==0)
	{
		return -1;
	}
	row =0;
	col =cols-1;
	while(row<rows&&col>=0)
	{
		/*减列*/
		if(*(data+row*cols+col)>key)
		{
			col-=1;
		}
		else if(*(data+row*cols+col)==key)
		{
			printf("row %d  col %d\n",row,col);
			return 1;
		}/*最后只能小于,则加行咯*/
		else
		{
			row+=1;
		}
	}
	return -1;
	
}
/*左下角开始*/
int findLeftBound(int **data,int rows,int cols,int key)
{
		int row;
	int col;
	
	if(rows==0||cols==0)
	{
		return -1;
	}
	row =rows-1;
	col =0;
	while(col<cols&&row>=0)
	{
		/*减列*/
		if(*(data+row*cols+col)>key)
		{
			row-=1;
		}
		else if(*(data+row*cols+col)==key)
		{
			printf("row %d  col %d\n",row,col);
			return 1;
		}/*最后只能小于,则加行咯*/
		else
		{
			col+=1;
		}
	}
	return -1;
}
int main()
{

	int data[4][4]={{1,2,8,9},{2,4,9,12},{4,7,10,13},{6,8,11,15}};
	int rows =4;
	int cols =4;
	int ret = -1;
	int key;
	scanf("%d",&key);
	ret = findRightBound((int **)data,rows,cols,key);
	if(ret == 1)
	{
		printf("OK\n");
	}
	else
	{
		printf("NO\n");
	}
	ret = findLeftBound((int **)data,rows,cols,key);
	if(ret == 1)
	{
		printf("OK\n");
	}
	else
	{
		printf("NO\n");
	}
	return 0;
}

左下角和右上角其实相似。

这里碰到个问题用于回顾

int **data

如果第二维是固定的,可以类似fun(char* p[4])这样的方式,如果不确定,那么就用二级指针,同时要用一个参数传递第二维的大小,类似fun(char** p, unsiged col),同时在表示其中一个元素时,不能使用p[i][j]这样的写法,必须自行计算出其偏移位置.

所以在函数中不能使用p[i][j]来取元素值,必须自己计算。

抱歉!评论已关闭.