剑指offer java版 test1—判断二维数组中是否有该整数

标题:剑指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.length
0的情况;
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;
}
}

做完题目后在牛客网上也看到了很多大佬的解法,更方便更快捷,受益颇多。也欢迎大佬们指出我代码的不足和欠缺,谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值