一个数组一旦创建之后,其数组长度不会再改变。
Arrays.toString(arr); //将数组中的元素拼接成字符串。
1.数组概念:
2.jvm内存模型
3.动态初始化
4.单个数组
5.多个引用变量指向一个数组
6.静态初始化
7.计数排序
题目:对取值范围在1~100的数据集合排序。
注:计数排序适用于这种小型的排序(数组元素个数不多,其元素值的范围较为集中)。
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;
}
}
}
··················································································································································································
作业:
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;
}
}
}