0
点赞
收藏
分享

微信扫一扫

从零开始学java——数组的练习

624c95384278 2022-04-13 阅读 47

目录

一、数组对象转为字符串对象

  1、转换说明

2、转换代码的实现

二、数组的拷贝

1、拷贝方法

2、拷贝代码的实现

(1)for循环手动拷贝(此时新数组的长度=原数组的长度,即为全部拷贝)

(2)方法拷贝 (此时新数组的长度<原数组的长度,从原数组的第一个开始赋值值,直到元素个数达到新数组的长度)

(3)方法拷贝(此时新数组长度>原数组长度,全拷贝,剩余的元素用新数组数据类型的默认值补齐)

 三、找到数组的最大元素

1、最大元素思路

2、最大元素代码实现

四、求一个数组的平均值

1、平均值思路

2、平均值代码实现

 五、查找一个数组中是否包含指定元素,若存在,返回第一个存在该元素的索引,若不存在,返回-1

1、指定元素思路

2、指定元素代码实现

 六、二分查找,在有序数组中查找元素

1、二分查找思路

2、二分查找代码实现

 七、判断一个数组是否有序,默认为升序

1、判断有序思路

2、判断有序代码实现

八、冒泡排序

1、冒泡思路

 2、冒泡排序代码实现

 3、冒泡排序的优化

(1)优化思路

(2)代码实现

九、数组逆序

1、逆序思路

2、逆序代码实现

 十、数组的数字排列(偶数放到前面,奇数放在后面)

1、排列思路

2、排列代码实现


一、数组对象转为字符串对象

  1、转换说明

          对于jdk中的某些类,在其后面加上s,这种类称为工具类,提供了大量有用的方法,例如直接调用Arrays-数组的工具类,包含数组转字符串的方法,数组排序的方法,等等操作数组的各种方法都在这个类中,我们可以直接通过调用类名称来使用。

2、转换代码的实现

import java.util.Arrays;

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,3,5};
        String ret= Arrays.toString(arr);
        System.out.println(ret);
    }
}

二、数组的拷贝

1、拷贝方法

2、拷贝代码的实现

(1)for循环手动拷贝(此时新数组的长度=原数组的长度,即为全部拷贝)


import java.util.Arrays;

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,3,5};
        int[] arr1=copy(arr);
        System.out.println(Arrays.toString(arr1));
    }
    public static int[] copy(int[] arr){
        int[] newarr=new int[arr.length];
        for (int i = 0; i < arr.length; i++) {
            newarr[i]=arr[i];

        }return newarr;
    }
}

(2)方法拷贝 (此时新数组的长度<原数组的长度,从原数组的第一个开始赋值值,直到元素个数达到新数组的长度)

import java.util.Arrays;

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,3,5,7,9,11};
        int[] newarr=Arrays.copyOf(arr,3);
        System.out.println("newarr:"+Arrays.toString(newarr));
    }

}

(3)方法拷贝(此时新数组长度>原数组长度,全拷贝,剩余的元素用新数组数据类型的默认值补齐)

import java.util.Arrays;

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,3,5,7,9,11};
        int[] newarr=Arrays.copyOf(arr,10);
        System.out.println("newarr:"+Arrays.toString(newarr));
    }

}

 三、找到数组的最大元素

1、最大元素思路

      我们在寻找最大值时,需要从数组的第一个数开始遍历,直到走到数组的最后一个元素,找到最大值 。

2、最大元素代码实现

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,9,4,6,15,17,10};
       int max= maxNum(arr);
        System.out.println(max);
    }
     public static int maxNum(int[] arr){
        int max=arr[0];
         for (int i = 0; i < arr.length; i++) {
             if (arr[i]>max){
                 max=arr[i];
             }
         }return max;
     }
}

四、求一个数组的平均值

1、平均值思路

数组的所有元素加和在除以数组长度

2、平均值代码实现

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,3,5,7};
        double avg=average(arr);
        System.out.println(avg);
    }
         public static double average(int[] arr){
        int sum=0;
         for (int i = 0; i < arr.length; i++) {
             sum+=arr[i];
         }return sum/ (double)arr.length;
     }
}

 五、查找一个数组中是否包含指定元素,若存在,返回第一个存在该元素的索引,若不存在,返回-1

1、指定元素思路

遍历数组,找到了返回索引,没找到返回-1

2、指定元素代码实现

public class test13 {
    public static void main(String[] args) {
        int[] arr=new int[]{1,3,5,7,14,35,68};
        System.out.println(find(arr,14));
        System.out.println(find(arr,100));
    }
         public static int find(int[] arr, int toFind){
             for (int i = 0; i < arr.length; i++) {
                 if (arr[i] == toFind){
                     return i;
                 }
             }
             return -1;
         }
}

 六、二分查找,在有序数组中查找元素

1、二分查找思路

在一个有序区间里,我们不断比较待查找元素和区间中间位置元素的大小关系:

(1)若toFind<arr[mid],说明这个元素一定处于左半边区间,则right=mid-1继续判断

(2)若toFind=arr[mid],说明这个元素恰好等于区间中间的元素

(3)若toFind>arr[mid],说明这个元素一定处于右半边区间,则left=mid+1继续判断

(4)循环的终止条件是left>right,此时区间里面的所有元素都已经查找完毕

2、二分查找代码实现

public class test13 {

    public static void main(String[] args) {
        int[] arr = new int[]{1, 3, 5, 7, 9, 11, 13, 15};
        System.out.println(binarySearch(arr, 11));
        System.out.println(binarySearch(arr, 30));
    }

    public static int binarySearch(int[] arr, int toFind) {
        int left = 0;             //在[left,right]区间中寻找toFind元素的索引
        int right = arr.length - 1;    //终止条件是当left>right,此时区间里面的所有元素检查完毕
        while (left <= right) {
            int mid = (left + right) / 2;
            if (toFind < arr[mid]) {
                right = mid - 1;
            } else if (toFind > arr[mid]) {
                left = mid + 1;
            } else {
                return mid;
            }
        }return -1;
    }
}

 七、判断一个数组是否有序,默认为升序

1、判断有序思路

就是去找反例,在升序数组中,前一个元素<=后一个元素,遍历数组,如果发现一个某个元素比后面的元素大,就找到了一个反例,就可以证明这个数组不是升序数组。

2、判断有序代码实现

public class test13 {

    public static void main(String[] args) {
        int[] arr = new int[]{1,5,9,2,4};
        int[] arr1=new int[]{1,2,3,4,5,6,7};
        System.out.println(jude(arr));
        System.out.println(jude(arr1));
    }
      public static boolean jude(int[] arr){
        //当i取到arr.length-1时,已将处于左后一个元素,后面没有元素可以比较了
          for (int i = 0; i < arr.length-1; i++) {  
              if (arr[i]>arr[i+1]){
                  return false;
              }
          }    return true;

      }
}

八、冒泡排序

1、冒泡思路

对要进行排序的数据中【相邻的数据进行两两比较,将较大的数放在后面】依次对所有数据进行操作,直至所有数据按要求完成排序。

 2、冒泡排序代码实现

public class test13 {

    public static void main(String[] args) {
        int[] arr = new int[]{7,6,5,4,3};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));

    }
     public static void bubbleSort(int[] arr){
        //最外层的循环表示遍历的次数,每遍历一次数组,就会有一个最大值放在了数组的最后面
         //当待排序的数组只剩下左后一个元素时,此时整个数组已将时有序的,就不需要在遍历了,所以i<arr.length-1
         for (int i = 0; i < arr.length-1; i++) {
             //最内层的循环表示元素的大小关系,如果前一个元素大于后面的元素,就交换他们两个的位置
             //初始时:待排序数组为[0,i-1]已排序数组为[]
             for (int j = 0; j < arr.length-1; j++) {
                 if (arr[j]>arr[j+1]){
                     int temp=arr[j];
                     arr[j]=arr[j+1];
                     arr[j+1]=temp;
                 }
             }
         }
     }
}

 

 3、冒泡排序的优化

(1)优化思路

如果存在一部分元素[1,2,3,4],此时内层循环根本就没有进行元素交换,此时这个数组就是有序的,此时排序过程结束

(2)代码实现

   public static void main(String[] args) {
        int[] arr = new int[]{7,6,5,4,3};
        bubbleSort(arr);
        System.out.println(Arrays.toString(arr));

    }
     public static void bubbleSort(int[] arr){
        //最外层的循环表示遍历的次数,每遍历一次数组,就会有一个最大值放在了数组的最后面
         //当待排序的数组只剩下左后一个元素时,此时整个数组已将时有序的,就不需要在遍历了,所以i<arr.length-1
         for (int i = 0; i < arr.length-1; i++) {
             boolean exchange=false;
             //最内层的循环表示元素的大小关系,如果前一个元素大于后面的元素,就交换他们两个的位置
             //初始时:待排序数组为[0,i-1]已排序数组为[]
             for (int j = 0; j < arr.length-1; j++) {
                 if (arr[j]>arr[j+1]){
                     exchange=true;
                     int temp=arr[j];
                     arr[j]=arr[j+1];
                     arr[j+1]=temp;
                 }
             }if (!exchange){
                 //此时内层循环已经没有元素交换,数组已将有序,则结束程序
                 break;
             }
         }
     }
}

九、数组逆序

1、逆序思路

对于数组[1,2,3,4,5]来说,只需要把第一个和最后一个交换,第二个和倒数第二个交换,以此类推就可,当(i>=j)时(此时i指的是前面的元素,j指的是后面的元素),就没有元素可以交换了,结束程序。

2、逆序代码实现

import java.util.Arrays;

public class test13 {

    public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6};
        reverse(arr);
        System.out.println(Arrays.toString(arr));
    }
   public static void reverse(int[] arr){
        int i=0;
        int j= arr.length-1;
        while (i<j){
            int temp=arr[i];
            arr[i]=arr[j];
            arr[j]=temp;
            i++;
            j--;
        }
   }
}

 十、数组的数字排列(偶数放到前面,奇数放在后面)

1、排列思路

这是一个双引用问题,从前向后找奇数,找到后放前面,从后往前找偶数,找到之后放后面

2、排列代码实现

 public static void main(String[] args) {
        int[] arr = new int[]{1,2,3,4,5,6,7,8,9};
        transform(arr);
        System.out.println(Arrays.toString(arr));
    }
    public static void transform(int[] arr) {
        int i = 0;
        int j = arr.length - 1;
        while (i < j) {
            // i从前向后找到第一个奇数停止
            // 若数组全是偶数,根本就找不到奇数
            while (i < j && arr[i] % 2 == 0) {
                i++;
            }
            // 此时i一定是落在了从前向后第一个奇数的位置
            // j从后向前找到第一个偶数停止
            // 若数组全是奇数,根本就找不到偶数
            while (i < j && arr[j] % 2 != 0) {
                j--;
            }
            // 此时j一定是落在了从后向前第一个偶数的位置
            int temp = arr[i];
            arr[i] = arr[j];
            arr[j] = temp;
            i ++;
            j --;
        }
    }
}

 

举报

相关推荐

0 条评论