数组操作
- 数组赋值——杨辉三角
- 数组的复制
- 数组的反转
- 线性查找
- 二分法查找
- java中的Arrays类
数组赋值——杨辉三角
- 给数组元素赋值
// 多维数组的使用1:使用二维数组打印一个10行杨辉三角
int[][] arr= new int[10][];
//给数组的元素赋值
for(int i = 0;i<arr.length;i++) {
arr[i] = new int[i+1];
//给首末元素赋值
arr[i][0] = arr[i][i] = 1;
//给其余元素赋值
for(int j = 1;j<arr[i].length-1;j++) {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
//错误代码
/* for(int j = 0;j<i;j++) {
if(i == 1 || i==j) {
arr[i][j] = 1;
}
else {
arr[i][j] = arr[i-1][j-1] + arr[i-1][j];
}
System.out.print(arr[i][j]);
}
System.out.println();*/
}
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();
}
输出
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1
1 6 15 20 15 6 1
1 7 21 35 35 21 7 1
1 8 28 56 70 56 28 8 1
1 9 36 84 126 126 84 36 9 1
定义一个int型的一维数组,包含10个元素,分别赋一写随机整数,求出最大值,最小值,和,平均值并输出。要求:所有的数都是两位数
int arr[] = new int[10];
for (int i = 0;i<arr.length;i++) {
arr [i] = (int)(Math.random()*(99 - 10 +1) + 10);//Java中生成a到b的随机数 (int)(Math.random()*(b-a)+a+1);
}
for(int x:arr) {
System.out.print(x+" ");
}
输出
25 75 81 86 56 35 22 12 26 22
数组的复制
错误写法
int[] array1 = new int[] {2,3,5,7,11,13,17,19};
int[] array2 = new int[8];
int temp = 0;
//数组的赋值必须通过遍历循环,不可以直接用“=”赋值,因为这样改变的只是把原来数组的
array2 = array1;
//修改array2。注意这里没有对array1进行操作
array2[0] = 0;
array2[1] = 0;
array2[2] = 0;
System.out.println();
//遍历新数组
for(int y:array2) {
System.out.print(y + "\t");
}
//遍历原数组
System.out.println();
for(int y:array1) {
System.out.print(y + "\t");
}
输出:
0 0 0 7 11 13 17 19
0 0 0 7 11 13 17 19
这里虽然只对新数组做了修改操作,但是原数组的元素依然发生了改变,这是因为,当我们用 "="赋值时,只是将原数组的地址值给了新数组名,即是说,其实新数组和原数组指向的是堆空间中的同一个数组
正确写法
int[] array1 = new int[] {2,3,5,7,11,13,17,19};
int[] array2 = new int[8];
int temp = 0;
//数组的赋值必须通过遍历循环,不可以直接用“=”赋值,因为这样改变的只是把原来数组的
for(int x:array1) {
if(temp%2 == 0) {
array2[temp] = temp;
}
else {
array2[temp] = x;
}
temp++;
System.out.print(x+"\t");
}
System.out.println();
for(int y:array2) {
System.out.print(y + "\t");
}
System.out.println();
for(int y:array1) {
System.out.print(y + "\t");
}
输出
2 3 5 7 11 13 17 19
0 3 2 7 4 13 6 19
2 3 5 7 11 13 17 19
总结:如果我们要复制一个数组,只能遍历赋值,一次把每一个元素赋给新数组元素。
数组的反转
数组的反转操作就是把原本在第一个的元素放在最后,在最后的元素放在开头,其他位置的元素也对称交换,这里需要定义中间变量来辅助完成操作
//例1
int[] array1 = new int[] {2,3,5,7,11,13,17,19};
for(int y:array1) {
System.out.print(y + "\t");
}
int x;//用于交换值的中间变量
for(int i = 0;i<array1.length/2;i++) {
x = array1[i];
array1[i] = array1[array1.length - i -1];
array1[array1.length - i - 1] = x;
}
System.out.println();
for(int y:array1) {
System.out.print(y + "\t");
}
线性查找
String[] arr = new String[] {"AA","BB","CC","DD","EE","FF","GG"};
boolean isFlag = true;
for(int i = 0;i < arr.length;i++) {
if(arr[i].equals("HH")) {
System.out.println("找到了指定的元素,位置为:"+i+" 是第 "+(i+1)+" 个元素.");
isFlag = false;
break;
}
}
if(isFlag) {
System.out.println("很抱歉,没有找到!");
}
二分法查找
二分法查找的前提是数组是有序的
int[] arr = new int[] {-10,-9,-6,2,3,5,7,15,17,99};
int dest = 99;
int head = 0;//初始的首索引
int end = arr.length - 1;//初始的末索引
boolean isFlag = true;
while(head <= end) {
int middle = (head + end)/2;
if(dest == arr[middle]) {
System.out.println("找到了指定的元素,位置为:"+middle+" 是第 "+(middle+1)+" 个元素.");
isFlag = false;
break;
}
else if(arr[middle]>dest) {
end = middle - 1;
}else {
head = middle + 1;
}
}
if(isFlag) {
System.out.println("很抱歉,没有找到!");
}
输出
找到了指定的元素,位置为:9 是第 10 个元素.
java中的Arrays类
Arrays常用方法 注意,使用binarySerch前,先对数组sort,因为binarySerch底层采用二分搜索技术。