进来准备找工作了,再看剑指offer,刚刚看了不多,就发现一个很有意义的事情,提醒自己要多动手,少瞎想。来给大家分享一下,作为自己的第一篇博客。
题目原内容:
在一个二维数组中,每一行从左至右递增排列,每一列从上之下递增排列,完成一个函数,输入这样一个数组和一个目标的数字,判断输入的数字是否在目标数组中。
解题的思路不给出了,在网上很好找到。直接贴代码来将自己的目的。
/*
参数:
int target 目标数字
int array[][5] 目标数组 我的目标数组实验用的列大小为5
int width 数组列数
int heigth 数组行数
返回值
int
1-->代表找到
0-->代表不存在
*/
int find(int target,int array[][5],int width,int heigth){
//int target_x = 0;
//int target_y = -1;
int y = width-1; //存储目标的位置Y
int x = 0; //存储目标位置X
//从右上角开始查找,至左下角目标方向
//横向列循环,依次循环从右至左移动一次
while(y>=0){
//找到目标数字,返回整形数字1
if(array[x][y] == target){
//printf("target X:%d,target Y:%d",x,y); 打印目标地址
return 1;
}
if(array[x][y] < target){
//竖向行循环,依次循环从上到下移动一次
while(x<width){
if(array[x][y] == target){
//printf("target X:%d,target Y:%d",x,y); 打印目标地址
return 1;
}else if(array[x][y] > target){
//行循环中止,继续列循环
break;
}else{
//printf("===row:%d\n",x); 打印行循环查找路径
x++;
}
}
}
//printf("===coloum:%d\n",y); 打印列循环查找路径
y--;
}
return 0;
}
接下来给一个书上的目标代码,人家写的很不错。简洁高效。严格来说并不完全一样,但是算法思路都是一样的。注释就不加了,这不是本次的重点。
int find(int target,int array[][5],int width,int heigth){
if(width>0&&heigth>0){
int row = 0;
int colume = heigth - 1;
while(row <width&&colume >= 0){
if(array[row][colume] == target){
return 1;
break;
}else if(array[row][colume]>target){
--colume;
}else{
++row;
}
}
}
return 0;
}
接下来是重点,本来看到这道题的时候,自己纸上草写一下代码,在VC里面跑的时候发现错误,原来自己考虑太简单,仅仅想到一个弯。仔细看题,发现作者给的例子有一点点误导性,但是人家书本讲解需要吧。不过人家的代码给的很好。
第一次博客,用来激励自己多联系,多用这种公开的方式监督自己好好学习。最后把自己第一次错误的代码拿出来“纪念一下”
// 错误代码 简单给一下,中间省去一下代码。主要表达错误思想
int find3(int target,int array[][5],int width,int heigth){
int target_y = 0;
for(int i=width-1;i>=0;i--){
// 相等输出
if(target == array[0][i]){
printf("target X:0,target Y:%d",i);
return 1;
}
// 大于说明在这一行以下,向这一行以下寻找
if(target > array[target_x][i]){
target_y = i+1;
}
}
for(int j=0;j<heigth;j++){
if(target == array[j][target_y]){
return 1;
}
}
return 0;
}