面试训练二维数组

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

感觉很有意思。

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

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

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

#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]来取元素值,必须自己计算。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值