week01_day05_数组&动态、静态初始化

一个数组一旦创建之后,其数组长度不会再改变。
Arrays.toString(arr); //将数组中的元素拼接成字符串。
1.数组概念:
week01_day05_数组&动态、静态初始化_第1张图片
2.jvm内存模型
week01_day05_数组&动态、静态初始化_第2张图片
3.动态初始化
week01_day05_数组&动态、静态初始化_第3张图片
4.单个数组
week01_day05_数组&动态、静态初始化_第4张图片
5.多个引用变量指向一个数组

week01_day05_数组&动态、静态初始化_第5张图片
6.静态初始化
week01_day05_数组&动态、静态初始化_第6张图片
7.计数排序
题目:对取值范围在1~100的数据集合排序。
注:计数排序适用于这种小型的排序(数组元素个数不多,其元素值的范围较为集中)。
week01_day05_数组&动态、静态初始化_第7张图片


	public static void countingSort(int[] arr) {
     
        //countArr用于计算arr中每个元素所出现的次数
        //arr[i]为countArr的下标
        //countArr[arr[i]]记录arr[i]出现的次数
        int[] countArr = new int[101];
        for (int i = 0; i < arr.length; i++) {
     
            countArr[arr[i]]++;
        }

        int index = 0;
        for (int i = 0; i < countArr.length; i++) {
     
            for (int j = 0; j < countArr[i]; j++) {
     
                arr[index++] = i;
            }
        }
    }

··················································································································································································

作业:

  1. 定义方法完成,打印 nxn乘法表(n的取值范围是[1-9])
  2. 给定一个排序数组,返回移除相同元素后数组的新长度。
    注:同LeetCode题目:删除排序数组中的重复项。
    提示:快慢指针法.
  3. 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那两个整数,并返回他们的数组下标,假设每种输入只会对应一个答案。(因为是两个数,所以下标值,有两个,所以该方法返回一个int[],里面包含两个整数对应的数组下标)
    注:同LeetCode题目:两数之和。
public class Homework03 {
     

    public static void main(String[] args) {
     
        int[] arr = {
     1, 2, 5, 8, 5, 7, 5, 3, 5, 7, 7, 6, 69};
        System.out.println(Arrays.toString(func(arr, 9)));
    }

    public static int[] func(int[] nums, int target) {
     
        int[] result = new int[2];
        outer:
        for (int i = 0; i < nums.length; i++) {
     
            for (int j = i + 1; j < nums.length; j++) {
     
                if (nums[i] + nums[j] == target) {
     
                    result[0] = i;
                    result[1] = j;
                    break outer;
                }
            }
        }
        return result;
    }
}

4.给定一个数组,将数组中的元素循环向右移动 k 个位置,其中 k 是非负数。

举例
输入: [1,2,3,4,5,6,7] 和 k = 3
输出: [5,6,7,1,2,3,4]
解释:
向右循环移动 1 位: [7,1,2,3,4,5,6]
向右循环移动 2 位: [6,7,1,2,3,4,5]
向右循环移动 3 步: [5,6,7,1,2,3,4]

注:此题同LeetCode题目:旋转数组。
这道题,rotate2是重点。

public class Homework04 {
     

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

    //法一:暴力破解法
    //旋转k次,每次将数组旋转一个元素
    public static void rotate(int[] nums, int k) {
     
        int temp;
        int pre;
        for (int i = 0; i < k; i++) {
     
            pre = nums[nums.length - 1];
            for (int j = 0; j < nums.length; j++) {
     
                temp = nums[j];
                nums[j] = pre;
                pre = temp;
            }
        }
    }

    //法二:
    //我们可以用一个额外的数组来将每个元素放到正确的位置上,也就是原本数组里下标为i的我们把
    //它放到(i+k)%数组长度的位置。然后把新的数组拷贝到原数组中。
    public static void rotate2(int[] nums, int k) {
     
        int[] newNums = new int[nums.length];
        for (int i = 0; i < nums.length; i++) {
     
            newNums[(i + k) % nums.length] = nums[i];
        }

//        for (int i = 0; i < newNums.length; i++) {
     
//            nums[i] = newNums[i];
//        }
        nums = Arrays.copyOfRange(newNums, 0, newNums.length);
        //为什么用Arrays.copy没用呢
        //因为你用Arrays.copy
        //其实是创建了一个新的数组,然后把该数组的地址,赋值给了nums,
        //但是你在主方法里,输出的还是原来的arr数组,根被就没有输出你复制之后的那个结果数组
        //相当于rotate2中的nums指向了你的结果数组,但是main方法中的arr指向的是原数组,
        //你在main方法里输出的是原数组的值,所以看上去没有改变
        //你用for循环,的时候,修改了nums数组中的元素,而nums数组指向的是原数组,
        //即main方法中的arr和rotate2中的nums都指向同一个数组
    }

    //法三:率辉方法
    public static void rotate3(int[] nums, int k) {
     
        k = k % nums.length;
        reverse(nums, 0, nums.length);
        reverse(nums, 0, k);
        reverse(nums, k, nums.length);
    }

    public static void reverse(int[] nums, int start, int end) {
     
        int temp;
        for (int i = start, j = end - 1; i < j; i++, j--) {
     
            temp = nums[i];
            nums[i] = nums[j];
            nums[j] = temp;
        }
    }
}

你可能感兴趣的:(JavaSE)