数组——排序、幻方、动态创建二维数组(杨辉三角)

一、数组特点:

  • 数组中的每一个数据元素都属于同一数据类型
  • 元素是基本类型,系统将默认规则赋初值元
  • 素类型是引用类型,则其所有元素为未赋初值状态(null)
  • 元素存储有先后顺序,属于构造数组类型
  • 一旦声明了数组大小就不能更改,数组的长度是固定不变的

二、声明数组:

1.一维数组:
格式1: 数组元素类型 数组名[] ;
格式2: 数组元素类型[] 数组名 ;
2.二维数组
格式1: 数组元素类型 数组名[][] ;
格式2: 数组元素类型[] []数组名 ;

三、一维数组赋值的三种方法

1.声明数组并分配空间

int [] nums1=new int[3];
nums1[0]=1;//数组下标
nums1[1]=2;
nums1[2]=3;

2.声明数组分配空间并赋值

int [] nums2=new int[]{1,2,3};

3.声明数组并赋值

int [] nums3={1,2,3};

四.二维数组赋值,创建空间

二维数组看作是数组的数组,不要求二维数组每一维的大小相同
1.直接为每一维分配空间

int a[][]=new int[2][3] ;  //两行三列

2.从最高维开始,按由高到低的顺序分别为每一维分配空间

int a[][]=new int [2][]; //先确定有两行,但是每一行有多少列不确定
a[0]=new int[3];//第一行有3列
a[1]=new int[4];//第二行有4列
//可以利用此方式动态创建二维数组

数组长度

int n=nums1.length; 

打印输出数组中的值

 for (int i=0;i<n;i++){
                     System.out.print(nums[i]);
        }


特殊for循环

//  for (元素类型  循环变量名 : 数组名)  { 循环体 } 
 for(int item:nums){System.out.print(item);} 

Arrays类:封装了对数组进行操作的一系列静态方法。

sort方法可方便地对数组排序:java.util.Arrays.sort(nums);

toString()方法可以将数组转化为字符串的形式:System.out.print( java.util.Arrays.toString(nums) );

数组应用:冒泡排序,二叉树排序,选择排序,快速排序

五、示例

示例1:编写并验证如下方法:

1)	对一维数组进行从大到小排序。
2)	求一维数组所有元素的平均值。
3)	查找某个数据在数组中的出现位置。

解题思路:
1) 先定义一个一维数组
2) 提供排序方法,注意传递参数为数组时,是引用传递,因此在排序方法中修改值,会影响到原本的一维数组,因此可以使用clone()方法,只是复制值
3) 提供一个求平均值的方法,依次遍历求和,记得平均值精度,float
4) 查找数据下标,遍历是否存在,然后查下标
程序代码:


import java.util.Scanner;

/**
 * 编写并验证如下方法:
 * (1)对一维数组进行从大到小排序。
 * (2)求一维数组所有元素的平均值。
 * (3)查找某个数据在数组中的出现位置。
 */


public class ArraysOpt {
    public static void main(String[] args) {
        int[] nums = {77, 6, 8, 9, 6, 5, 4, 8, 3};//一维数组
        System.out.println("arrays:");
        for (int item : nums
                ) {
            System.out.print(item + "\t");
        }
        //(1)从大到小排序。
        sortByDesc(nums.clone());//不影响原本数组的排序
        //(2)求一维数组所有元素的平均值。
        System.out.println("\navg:"+getAvg(nums));
        //(3)查找某个数据在数组中出现的位置
        System.out.println("\n请输入需要查找的数");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        findIndex(nums, n);


    }

    private static float getAvg(int[] nums) {
        int sum=0;
        for (int num : nums
                ) {  sum+=num;
        }
        return (float)sum/nums.length;
    }

    private static void findIndex(int[] nums, int n) {
        //查找某个数据在数组中出现的位置
        int index = -1;//先假设该数据不存在
        for (int k = 0; k < nums.length; k++) {
            if (nums[k] == n) {
                index = k;//若存在,则下标
                break;
            }
        }
        if (index != -1) {
            System.out.print(n + "所在下标为" + index);
        } else
            System.out.print("该数据不存在");
    }

    private static void sortByDesc(int[] nums) {
        //利用冒泡排序
        for (int i = 0; i < nums.length - 1; i++) {
            for (int j = 0; j < nums.length - 1 - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    int temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                }
            }
        }
        System.out.println("\nBy Desc:");
        for (int item : nums
                ) {
            System.out.print(item + "\t");
        }
    }
}

运行结果:
数组结果
示例2:幻方是一个奇数阶矩阵,每个元素值不同,且它的每一行之和、每一列之和、左对角线之和以及右对角线之和都等于一个相同的数。编写一个程序验证输入的3阶矩阵是否为幻方。一下为两组验证数据。
4 9 2 49 113 17
3 5 7 29 59 89
8 1 6 101 5 71

解题思路:

  1. 此处判断3阶矩阵,即3行3列,因此用二维数组存储更恰当
  2. 先默认输入矩阵为幻方,再根据条件一个一个的排除,来证明猜想
  3. 每个元素值不同:循环判断元素值,如果全部相同则为flase,元素值不重复,考虑HashSet
  4. 和相等:先判断两个对角线和是否相等,若不等则为flase;若对角线和相等,则保存和值s,再把列和/行和与s相比较,任意一个若不等,则为false
  5. 若都通过了前面的条件,说明该幻方即为true,猜想成立

程序代码:

import java.util.HashSet;
import java.util.Scanner;

/**
 * 幻方是一个奇数阶矩阵,每个元素值不同,
 * 且它的每一行之和、每一列之和、左对角线之和以及右对角线之和都等于一个相同的数。
 * 编写一个程序验证输入的3阶矩阵是否为幻方。一下为两组验证数据。
 * 4	9	2                 49	 113	17
 * 3	5	7                 29    59     89
 * 8	1	6                 101   5      71
 */
public class Matrices {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int[][] nums = new int[3][3];//存放在二维数组
        System.out.println("请输入矩阵(3*3):");
        //确定次数用for循环
        for (int i = 0; i < 3; i++) {//二维,双重循环
            for (int j = 0; j < 3; j++) {
                nums[i][j] = input.nextInt();
            }
        }
        boolean flag = true;//先默认是幻方
        //判断元素值是否不等
        HashSet<Integer> hashSet = new HashSet<Integer>();//hashSet不包含重复元素的集合。
        for (int i = 0; i < 3; i++) {//二维,双重循环
            for (int j = 0; j < 3; j++) {
                hashSet.add(nums[i][j]);//把数组元素存入hashset,并且不存入多余重复的值
            }
        }
        if (flag=(hashSet.size()== 9)) {
            //先把对角线和求出
            int sum1 = nums[0][0] + nums[1][1] + nums[2][2];
            int sum2 = nums[0][2] + nums[1][1] + nums[2][0];
            if (sum1 != sum2) {//先判断对角线和是否相等
                flag = false;
            } else {
                int s = sum1;//如果相等,保存和值
                for (int i = 0; i < 3; i++) {
                    sum1 = 0;
                    sum2 = 0;
                    for (int j = 0; j < 3; j++) {
                        sum1 += nums[i][j];//计算每一行之和
                        sum2 += nums[j][i];//计算每一列之和
                    }
                    if (s != sum1 || s != sum2) {//判断行,列,对角线是否相等
                        flag = false;
                        break;
                    }
                }
            }
        }
        System.out.println("是否为幻方:" + flag);
    }
}

运行结果:
幻方结果
示例3:动态创建二维数组
打印杨辉三角:第0列和对角线上的元素均为1,其他元素的值均为上一行的同列元素和前一列元素之和
方法1:使用普遍方法实现

private static void triangle1() {
    //Yang Hui triangle 杨辉三角
    //第0列和对角线上的元素均为1,其他元素的值均为上一行的同列元素和前一列元素之和;
    int[][] nums = new int[10][10];
    int i, j;
    for (i = 0; i < 10; i++) {
        nums[i][0] = 1;//第0列
        nums[i][i] = 1;//对角线
    }
    //从第三行第二列开始赋值,第几行就有几列
    for (i = 2; i < 10; i++) {
        for (j = 1; j < i; j++) {
            nums[i][j] = nums[i - 1][j] + nums[i - 1][j - 1];
        }

    }
    //打印格式,第几行就有几列
    for (i = 0; i < 10; i++) {
        for (j = 0; j <= i; j++) {
            System.out.print("\t" + nums[i][j]);
        }
        System.out.println("\n");
    }
}

方法2:使用动态创建二维数组实现

private static void triangle2() {
    int[][] nums = new int[10][];
    for (int i = 0; i < 10; i++) {
        nums[i] = new int[i + 1];//初始化第二层数组的大小
        //Java语言中的二维数组其实是每个元素都是一个一维数组的一维数组,所以第二维的长度可以任意

        for (int j = 0; j <= i; j++) {
            if (i == 0 || j == 0 || j == i) {
                nums[i][j] = 1;
            } else {
                nums[i][j] = nums[i - 1][j] + nums[i - 1][j - 1];
            }
            System.out.print(nums[i][j] + "\t");
        }
        System.out.println();
    }

}

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值