javaSE(从0开始)day06

目录

一、数组的合并

1 无序数组的合并:

    (1)双指针合并:

    (2).使用两个for循环合并

2、有序数组的合并: 新数组也是有序的

     (1)拉链法:

二、数组的复制:

 1、System.arraycopy(被复制的数组名,int x(从下标x开始),新的数组名,int x(开始的位置),int x(复制的长度))

2 使用Arrays下面的两个方法:

      (1)int[] copyOf(复制的数组,int newLength)

      (2)int[]copyOfRange(复制的数组,int beging,int end)

三、数组乱序(洗牌算法)

1、假设有一组等待乱序的数组P

2、从P中随机选取一个未乱序的元素

3、将该元素与数组P中最后一个未乱序的元素交换

4、重复2-3的步骤,直到数组P中元素全部完成乱序

四、数组的旋转

        1、右旋:

2、左旋:

 五、Arrays的常用方法

1、 void fill(要填充的数组a,要给数组填充的值val)

2、void sort(要排序的数组)整型默认升序排序

3、int binarySearch(数组名,查找元素)返回下标,如果未找到,返回负值

4、int[] copyOf(复制的数组,int newLength)

六、二维数组

         1、动态初始化:

2、静态初始化:

3、静态省略初始化:

 六、二维数组的遍历

1、双重for循环

2、foreach 循环

3、将二维数组转成字符串遍历:


一、数组的合并

1 无序数组的合并:

          建立一个新数组合并,新数组的长度是两个数组的长度之和。将达尔戈数组加在第一个后面。

         (1)双指针合并:

int[] arr1 = { 1, 2, 3, 4, 5, 6, 7 };
        int[] arr2 = {56, 89, 34, 62, 17 };
        int[] p = new int[arr1.length+arr2.length];
        int[] m = new int[arr1.length+arr2.length];
        int maxLength=Math.max(arr1.length,arr2.length);
        for (int i = 0; i < maxLength; i++) {
            if(i<arr1.length) {
                p[i] = arr1[i];
            }
            if (i<arr2.length) {
                p[arr1.length + i] = arr2[i];
            }
        }

            (2).使用两个for循环合并

        int[] arr1 = { 1, 2, 3, 4, 5, 6, 7 };
        int[] arr2 = {56, 89, 34, 62, 17 };
        int[] p = new int[arr1.length+arr2.length];
         for(int i=0;i<arr1.length;i++ ){
            m[i]=arr1[i];
        }
        for(int i=0;i<arr2.length;i++ ){
            m[i+arr1.length]=arr2[i];
        }

2、有序数组的合并: 新数组也是有序的

   (1)拉链法:

int [] arr1={1,3,5,9,34};
        int [] arr2 ={2,4,6,8,13};
        int [] newArr=new int[arr1.length+arr2.length];
        int i=0,j=0,k=0;
        while(i<arr1.length&& j<arr2.length){
            if(arr1[i]<=arr2[j]){
                newArr[k++]=arr1[i++];
            }else {
                newArr[k++]=arr2[j++];
            }
        }
        while(i<arr1.length){
            newArr[k++]=arr1[i++];
        }
        while(i<arr2.length){
            newArr[k++]=arr2[j++];
        }

二、数组的复制:

 1、System.arraycopy(被复制的数组名,int x(从下标x开始),新的数组名,int x(开始的位置),int x(复制的长度))

System.arraycopy(arr1,2,newArr,3,arr1.5);

//将arr1数组从下标为2开始截取5个长的的值,复制到newArr数组从下标3开始

2 使用Arrays下面的两个方法:

      (1)int[] copyOf(复制的数组,int newLength)

      (2)int[]copyOfRange(复制的数组,int beging,int end)

        //int[] copyOf(复制的数组,int newLength)
        //如果newLength超过要复制的数组的长度,其余元素用默认值填充
        // 在复制过程中,从下标为0的位置开始复制
        int[] arr2 ={1,2,3,4,5};
        int[] newArr1 = Arrays.copyOf(arr2,7);
        System.out.println(Arrays.toString(newArr1));
        //int[]copyOfRange(复制的数组,int beging,int end)
        // 如果end超过了要复制的数组的下标,则用数组的默认值填充
        int[]copyArr = Arrays.copyOfRange(arr2,2,6);
        System.out.println(Arrays.toString(copyArr));

三、数组乱序(洗牌算法)

      数组乱序,也被称为数组洗牌,实现算法中有一个非常著名的洗牌算法Fisher-Yates算法,是由 Ronald A.FisherFrank Yates1938年发明的,后来被Knuth在自己的著作《The Art of Computer Programming》中介绍,很多人直接称Knuth洗牌算法。

  1. 假设有一组等待乱序的数组P

  2. P中随机选取一个未乱序的元素

  3. 该元素数组P中最后一个未乱序的元素交换

  4. 重复2-3的步骤,直到数组P中元素全部完成乱序

            //数组乱序,洗牌算法
            //每次那最后一个元素和随机生成的下标位置的元素交换(随机位置小于交换位置)
            int[] arr={1,2,3,4,5,6,7,8,9};
            for(int i=arr.length-1;i>=0;i--){
                //找随机下标    从后往前
                int random=(int)(Math.random()*i);
                //交换
                int temp=arr[i];
                arr[i]=arr[random];
                arr[random]=temp;
            }
            System.out.println(Arrays.toString(arr));

    四、数组的旋转

               1、右旋:

                      

              2、左旋:

                       

         //旋转
        //右旋
        int [] arr={1,2,3,4,5,6,7,8,9};
        int [] arr1={1,2,3,4,5,6,7,8,9};
        System.out.println("原数组:"+Arrays.toString(arr));

            for (int i = arr.length - 1; i >0; i--) {
                arr[i] = arr[i] ^ arr[i - 1];
                arr[i - 1] = arr[i] ^ arr[i - 1];
                arr[i] = arr[i] ^ arr[i - 1];
            }
        System.out.println("右旋:"+Arrays.toString(arr));
        for(int i=0;i<arr1.length-1;i++){
            arr1[i]=arr1[i]^arr1[i+1];
            arr1[i+1]=arr1[i]^arr1[i+1];
            arr1[i]=arr1[i]^arr1[i+1];
        }

        System.out.println("右旋:"+Arrays.toString(arr1));
   

 五、Arrays的常用方法

    1、 void fill(要填充的数组a,要给数组填充的值val)

        int[] arr=new int[100];
        Arrays.fill(arr,2);//都填充为2
        System.out.println(Arrays.toString(arr));
        // void fill(要填充的数组a,要填充的起始位置,结束位置-1,要给数组填充的值val)
        Arrays.fill(arr, 1,4,5);
        System.out.println(Arrays.toString(arr));

     2、void sort(要排序的数组)整型默认升序排序

              void sort(要排序的数组)整型默认升序排序

              void sort(要排序的数组,起始下标,结束下标)整型默认升序排序

 Arrays.sort(arr);
 Arrays.sort(arr,1, 5);
 System.out.println(Arrays.toString(arr));

 3、int binarySearch(数组名,查找元素)返回下标,如果未找到,返回负值

int[]  arr1={1,2,4,5,6,7,8};
//int index=Arrays.binarySearch(arr,7);
// System.out.println(index);
//限定二分查找元素的范围,从beign~end-1
int index = Arrays.binarySearch(arr1, 1, 4, 5);
System.out.println(index);

4、int[] copyOf(复制的数组,int newLength)

//如果newLength超过要复制的数组的长度,其余元素用默认值填充
// 在复制过程中,从下标为0的位置开始复制
int[] arr2 ={1,2,3,4,5};
int[] newArr1 = Arrays.copyOf(arr2,7);
System.out.println(Arrays.toString(newArr1));
//int[]copyOfRange(复制的数组,int beging,int end)
// 如果end超过了要复制的数组的下标,则用数组的默认值填充
int[]copyArr = Arrays.copyOfRange(arr2,2,6);
System.out.println(Arrays.toString(copyArr));

六、二维数组

 1、动态初始化:

  数据类型[ ][ ] 数组名=new 数据类型[长度] [ ] : int[ ][ ]  arr1 =new int[3][ ];

      int[][] arr1 =new int[3][4];
        //取值
        System.out.println("元素一:"+ Arrays.toString(arr1[0]));//元素一:[0, 0, 0, 0]
        System.out.println("元素二:"+ Arrays.toString(arr1[1]));//元素二:[0, 0, 0, 0]
        System.out.println("元素三:"+ (arr1[2]));元素三:[I@1b6d3586  打印的地址

        //赋值
        int[] ns1={1,2,3,4};
        arr1[0]=ns1;
        arr1[1]=new int[]{5,5,5};
        arr1[2]=new int[0];

        //重新赋值后
        System.out.println("元素一:"+ Arrays.toString(arr1[0]));//[1, 2, 3, 4]
        System.out.println("元素二:"+ Arrays.toString(arr1[1]));//[5, 5, 5]
        System.out.println("元素三:"+ Arrays.toString(arr1[2]));//[]

2、静态初始化:

数据类型[ ][ ] 数组名=new 数据类型[ ] [ ]{数组类型元素一,数组类型元素二、数组类型元素三、...}

int[][] arr1 =new int[][]{{1,2,3},null,{8,9}};

3、静态省略初始化:

数据类型[ ][ ] 数组名={数组类型元素一,数组类型元素二、数组类型元素三、...}

int[][] arr1 ={{1,2,3},null,{8,9}};

 六、二维数组的遍历

    1、双重for循环

      //for循环
        for (int i = 0; i < arr.length ; i++) {
            for (int j = 0; j <arr[i].length ; j++) {
                System.out.print(arr[i][j]+" ");
            }
            System.out.println();
        }

2、foreach 循环

       //foreach
        for (int[] temp: arr) {
            for (int number:temp){
                System.out.print(number+" ");
            }
            System.out.println();
        }

3、将二维数组转成字符串遍历:

System.out.println(Arrays.deepToString(arr));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呼哧呼哧.

栓Q!!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值