标题:剑指offer java版 test1—判断二维数组中是否有该整数
题目: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
要求:补全下面代码块,达到题目要求。
public class Solution {
public boolean Find(int target, int [][] array) {
}
}
在写代码的过程中碰到了两个问题:
问题1:Missing return statement 没有返回语句。造成原因是在写代码的过程中,写了很多if条件判断语句 而在有些情况下,函数没有返回值。所有设置一个标志位,boolean bl=false,当判断出该数组中存在该整数时bl=true,其余情况下,bl=false。
问题2:java.lang.ArrayIndexOutOfBoundsException: 0 数组越界问题。我写完代码后,有个例子(16,[[]])无法通过。所有重新添加了判断数组是否为空的语句。
对于一维数组判断数组为空的方式如下:
if(arraynull||array.length0)
array.length=0表示给数组分配了地址,但是还没有存东西;而array==null 表示数组连地址都没有分配,就是个空的。由于判断时用的是 || 符号,所以一般将array=null写在前面。
参考下这段代码:结果为false和true
package cn.test29;
import java.util.ArrayList;
public class test2 {
public static void main(String[] args){
ArrayList arrayList=new ArrayList<>();
System.out.println(arrayList==null);//数组不为null
System.out.println(arrayList.isEmpty());//但数组中没用元素,数长度为0
}
}
同理,对于二维数组为空的判断方式如下:if((arraynull||array.length0)||(array.length1&&array[0].length0))
(array.length表示二维数组的行数,array[0].length表示二维数组的列数)
1、二维数组首地址是否为空,即arraynull;
2、二维数组为{},即array.length0的情况;
3、二维数组是否为{{}},即array.length=1&&array[0].length==0的情况;**
我在条件判断时,使用了array[array.length-1][array[0].length-1];所以当出现第2 第3种情况时,就会有数组越界报错。第一种情况 一是会出现空指针报错。完整代码如下(array=null的判断应该可以不加在Find()函数内,因为还没到Find()函数时就报空指针):
public class Solution {
public boolean Find(int target, int [][] array) {
int row = array.length;
int col=array[0].length;
boolean bl=false;
if((row==0)||(row==1&&col==0)){
return false;
}
if (array[0][0] <= target && target <= array[row-1][col-1]) {
a:for(int i=0;i<=row-1;i++){
for(int j=0;j<=col-1;j++){
if(target==array[i][j]){
bl=true;
break a;
}
}
}
}
return bl;
}
}
做完题目后在牛客网上也看到了很多大佬的解法,更方便更快捷,受益颇多。也欢迎大佬们指出我代码的不足和欠缺,谢谢。