剑指Offer题目一:
在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样一个二维数组和一个整数,判断数组中是否含有该整数。
解题思路:
- 定义一个二维数组。
- 对二维数组中的数据进行排序。
- 手动输入二维数组的所有数据。(也可以随机生成,较为简单,但是依题意,还是手动输入。)
- 对二维数组中的数据进行遍历,对输入的数据和数组中的数据进行匹配,匹配成功则返回true。
代码如下:
package Offer_1;
import java.util.Arrays;
import java.util.Scanner;
public class Demo {
public static void main(String[] args) {
int[][] a = new int[4][3];
//随机生成的二维数组
// System.out.println("随机生成的二维数组a如下:");
// for(int i=0;i<5;i++){
// for(int j=0;j<8;j++){
// a[i][j]=(int) (Math.random()*100);
// System.out.print(a[i][j]+" ");
// }
// System.out.println(" ");
// }
//手动输入二维数组的数据
for(int i=0;i<4;i++){
for(int j=0;j<3;j++){
System.out.println("input:");
Scanner sc = new Scanner(System.in);
a[i][j] = sc.nextInt();
}
}
System.out.println("您输入的二维数组a如下:");
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
System.out.print(a[i][j]+" ");
}
System.out.println(" ");
}
int b[] =new int[12];
for(int i=0;i<a.length;i++){
System.arraycopy(a[i], 0, b, 3*i, a[i].length);
}
// System.out.println("复制过来的数组为:"+Arrays.toString(b));
Arrays.sort(b);
// System.out.println("排好序的一维数组如下:"+Arrays.toString(b));
//将一维数组b复制到二维数组c
int c[][] = new int[4][3];
for(int i=0;i<c.length;i++){
System.arraycopy(b, 3*i, c[i], 0, 3);
}
System.out.println("排好序的二维数组为:"+Arrays.deepToString(c));
System.out.println("请输入一个整数:");
Scanner m = new Scanner(System.in);
int num = m.nextInt();
selectArray(c,num);
}
private static boolean selectArray(int[][] a,int num){
boolean flag = false;
int m = 0;
int n = 0;
for(int i=0;i<a.length;i++){
for(int j=0;j<a[i].length;j++){
// System.out.println(a[i][j]+" ");
if(num==a[i][j]){
flag = true;
m = i;
n = j;
// return flag;
}
}
}
if(flag){
System.out.println("数组包含该整数:"+num+",且该数在数组中的坐标为:"+"["+m+"]"+"["+n+"]");
}else{
System.out.println("该数组中不包含该整数!");
}
return flag;
}
}
代码中有随机生成数组值和手动输入两种方法的代码。二维数组的排序相对于一维数组的排序较为复杂一点,一维数组的排序可以用选择法和冒泡法。二维数组的排序,这里我用到的是用一维数组存放二维数组的值,然后在一维数组中进行排序,最后创建一个新的二维数组去存放排好序的数组。
写程序过程中遇到的最大的问题是手动输入二维数组的值时,需要指定数组的长度,否则无法成功将输入的值存入数组中。
运行结果