关于数组的常见算法

一、案例一

|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例:定义一个int型的一维数组,包含10个元素,分别赋一些随机整数,然后求出所有元素的最大值,最小值,总和,平均值,并输出出来 要求:所有随机数都是两位数:[10,99] 提示:求[a,b]范围内的随机数: (int)(Math.random() * (b - a + 1)) + a; |
| 代码实现 | public class ArrayExer01 { public static void main(String[] args) { //1. 动态初始化方式创建数组 int[] arr = new int[10]; //2. 通过循环给数组元素赋值 for (int i = 0; i < arr.length; i++) { arr[i] = (int)(Math.random() * (99 - 10 + 1)) + 10; System.out.print(arr[i] + "\t"); } System.out.println(); //3.1 求最大值 int max = arr[0]; for (int i = 1; i < arr.length; i++) { if(max < arr[i]){ max = arr[i]; } } System.out.println("最大值为:" + max); //3.2 求最小值 int min = arr[0]; for (int i = 1; i < arr.length; i++) { if(min > arr[i]){ min = arr[i]; } } System.out.println("最小值为:" + min); //3.3 求总和 int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arr[i]; } System.out.println("总和为:" + sum); //3.4 求平均值 int avgValue = sum / arr.length; System.out.println("平均值为:" + avgValue); } } |

二、案例二

|------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例:评委打分 分析以下需求,并用代码实现: (1)在编程竞赛中,有10位评委为参赛的选手打分,分数分别为:5,4,6,8,9,0,1,2,7,3 (2)求选手的最后得分(去掉一个最高分和一个最低分后其余8位评委打分的平均值) |
| 代码实现 | public class ArrayExer02 { public static void main(String[] args) { int[] scores = {5,4,6,8,9,0,1,2,7,3}; //声明三个特征值 int sum = 0; int max = scores[0]; int min = scores[0]; for (int i = 0; i < scores.length; i++) { sum += scores[i]; //累加总分 //用于获取最高分 if(max < scores[i]){ max = scores[i]; } //用于获取最低分 if(min > scores[i]){ min = scores[i]; } } int avg = (sum - max - min) / (scores.length - 2); System.out.println("去掉最高分和最低分之后,平均分为:" + avg); } } |

三、案例三

|-------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 找最值及其所有最值的下标 |
| 代码实现一 | public class Test13AllMaxIndex { public static void main(String[] args) { int[] arr = {4,5,6,1,9,9,3}; //找最大值 int max = arr[0]; for(int i=1; i<arr.length; i++){ if(arr[i] > max){ max = arr[i]; } } System.out.println("最大值是:" + max); System.out.print("最大值的下标有:"); //遍历数组,看哪些元素和最大值是一样的 for(int i=0; i<arr.length; i++){ if(max == arr[i]){ System.out.print(i+"\t"); } } System.out.println(); } } |
| 代码实现二 | public class Test13AllMaxIndex2 { public static void main(String[] args) { int[] arr = {4,5,6,1,9,9,3}; //找最大值 int max = arr[0]; String index = "0"; for(int i=1; i<arr.length; i++){ if(arr[i] > max){ max = arr[i]; index = i + ""; }else if(arr[i] == max){ index += "," + i; } } System.out.println("最大值是" + max); System.out.println("最大值的下标是[" + index+"]"); } } |

四、案例四

|------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例:使用二维数组打印一个 10 行杨辉三角。 提示: 1. 第一行有 1 个元素, 第 n 行有 n 个元素 2. 每一行的第一个元素和最后一个元素都是 1 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即: yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j]; |
| 代码实现 | public class YangHuiTest { public static void main(String[] args) { //1. 创建二维数组 int[][] yangHui = new int[10][]; //2.使用循环结构,初始化外层数组元素 for(int i = 0;i < yangHui.length;i++){ yangHui[i] = new int[i + 1]; //3. 给数组的元素赋值 //3.1 给数组每行的首末元素赋值为1 yangHui[i][0] = yangHui[i][i] = 1; //3.2 给数组每行的非首末元素赋值 //if(i >= 2){ for(int j = 1;j < yangHui[i].length - 1;j++){ //j从每行的第2个元素开始,到倒数第2个元素结束 yangHui[i][j] = yangHui[i - 1][j] + yangHui[i - 1][j - 1]; } //} } //遍历二维数组 for (int i = 0; i < yangHui.length; i++) { for (int j = 0; j < yangHui[i].length; j++) { System.out.print(yangHui[i][j] + "\t"); } System.out.println(); } } } |

五、案例五

|----------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例:复制、赋值 使用简单数组 (1)创建一个名为ArrayTest的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。 (2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。 (3)显示array1的内容。 (4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。 (5)打印出array1。 思考:array1和array2是什么关系? 【answer】array1和array2是两个变量,共同指向了堆空间中的同一个数组结构。即二者的地址值相同。 拓展:修改题目,实现array2对array1数组的复制 |
| 代码实现(赋值) | public class ArrayExer04 { public static void main(String[] args) { //(1)创建一个名为ArrayExer04的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。 int[] array1,array2; //(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。 array1 = new int[]{2,3,5,7,11,13,17,19}; //(3)显示array1的内容。 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + "\t"); } //(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。 array2 = array1; System.out.println(); System.out.println(array1); System.out.println(array2); for (int i = 0; i < array2.length; i++) { if(i % 2 == 0){ array2[i] = i; } } System.out.println();//换行 //(5)打印出array1。 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + "\t"); } } } |
| 代码实现(复制) | public class ArrayExer04_1 { public static void main(String[] args) { //(1)创建一个名为ArrayExer04的类,在main()方法中声明array1和array2两个变量,他们是int[]类型的数组。 int[] array1,array2; //(2)使用大括号{},把array1初始化为8个素数:2,3,5,7,11,13,17,19。 array1 = new int[]{2,3,5,7,11,13,17,19}; //(3)显示array1的内容。 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + "\t"); } //(4)复制array1数组给array2,修改array2中的偶索引元素,使其等于索引值(如array[0]=0,array[2]=2)。 array2 = new int[array1.length]; for (int i = 0; i < array1.length; i++) { array2[i] = array1[i]; } System.out.println(); System.out.println(array1); System.out.println(array2); for (int i = 0; i < array2.length; i++) { if(i % 2 == 0){ array2[i] = i; } } System.out.println();//换行 //(5)打印出array1。 for (int i = 0; i < array1.length; i++) { System.out.print(array1[i] + "\t"); } } } |

六、案例六

|-------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例: 定义数组:int[] arr = new int[]{34,54,3,2,65,7,34,5,76,34,67}; 如何实现数组元素的反转存储?你有几种方法。 |
| 代码实现1 | public class ArrayExer05 { public static void main(String[] args) { int[] arr = new int[]{34,54,3,2,65,7,34,5,76,34,67}; //遍历 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } System.out.println(); //反转操作 //方式1: for(int i = 0;i < arr.length/2;i++){ //交互arr[i] 与 arr[arr.length - 1 - i]位置的元素 int temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; } } } |
| 代码实现2 | public class ArrayExer05 { public static void main(String[] args) { int[] arr = new int[]{34,54,3,2,65,7,34,5,76,34,67}; //遍历 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } System.out.println(); //反转操作 //方式2: for(int i = 0,j = arr.length - 1;i < j;i++,j--){ //交互arr[i] 与 arr[j]位置的元素 int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } |
| 代码实现3 | public class ArrayExer05 { public static void main(String[] args) { int[] arr = new int[]{34,54,3,2,65,7,34,5,76,34,67}; //遍历 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } System.out.println(); //反转操作 //方式3:不推荐 int[] newArr = new int[arr.length]; for(int i = arr.length - 1;i >= 0;i--){ newArr[arr.length - 1 - i] = arr[i]; } arr = newArr; //遍历 for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + "\t"); } } } |

七、案例七

|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 一个数组,让数组的每个元素去除第一个元素,得到的商作为被除数所在位置的新值。 |
| 代码实现 | public class Test3 { public static void main(String[] args) { int[] arr = new int[]{12,43,65,3,-8,64,2}; // for(int i = 0;i < arr.length;i++){ // arr[i] = arr[i] / arr[0]; // } for(int i = arr.length -1;i >= 0;i--){ arr[i] = arr[i] / arr[0]; } //遍历arr for(int i = 0;i < arr.length;i++){ System.out.print(arr[i] + " "); } } } |

七、案例七

|------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 创建一个长度为6的int型数组,要求数组元素的值都在1-30之间,且是随机赋值。同时,要求元素的值各不相同。 |
| 代码实现 | public class Test4 { // 5-67 Math.random() * 63 + 5; @Test public void test1() { int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31) arr[i] = (int) (Math.random() * 30) + 1; boolean flag = false; while (true) { for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { flag = true; break; } } if (flag) { arr[i] = (int) (Math.random() * 30) + 1; flag = false; continue; } break; } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } //更优的方法 @Test public void test2(){ int[] arr = new int[6]; for (int i = 0; i < arr.length; i++) {// [0,1) [0,30) [1,31) arr[i] = (int) (Math.random() * 30) + 1; for (int j = 0; j < i; j++) { if (arr[i] == arr[j]) { i--; break; } } } for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } } } |

八、案例八:回形数

|-------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 从键盘输入一个整数(1~20) ,则以该数字为矩阵的大小,把1,2,3...n*n 的数字按照顺时针螺旋的形式填入其中。 例如: 输入数字2,则程序输出: 1 2 4 3 输入数字3,则程序输出: 1 2 3 8 9 4 7 6 5 输入数字4, 则程序输出: 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 |
| 代码实现一 | //方式1 public class RectangleTest { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.println("输入一个数字"); int len = scanner.nextInt(); int[][] arr = new int[len][len]; int s = len * len; /* * k = 1:向右 * k = 2:向下 * k = 3:向左 * k = 4:向上 */ int k = 1; int i = 0,j = 0; for(int m = 1;m <= s;m++){ if(k == 1){ if(j < len && arr[i][j] == 0){ arr[i][j++] = m; }else{ k = 2; i++; j--; m--; } }else if(k == 2){ if(i < len && arr[i][j] == 0){ arr[i++][j] = m; }else{ k = 3; i--; j--; m--; } }else if(k == 3){ if(j >= 0 && arr[i][j] == 0){ arr[i][j--] = m; }else{ k = 4; i--; j++; m--; } }else if(k == 4){ if(i >= 0 && arr[i][j] == 0){ arr[i--][j] = m; }else{ k = 1; i++; j++; m--; } } } //遍历 for(int m = 0;m < arr.length;m++){ for(int n = 0;n < arr[m].length;n++){ System.out.print(arr[m][n] + "\t"); } System.out.println(); } } } |
| 代码实现二 | //方式2 /* 01 02 03 04 05 06 07 24 25 26 27 28 29 08 23 40 41 42 43 30 09 22 39 48 49 44 31 10 21 38 47 46 45 32 11 20 37 36 35 34 33 12 19 18 17 16 15 14 13 */ public class RectangleTest1 { public static void main(String[] args) { int n = 7; int[][] arr = new int[n][n]; int count = 0; //要显示的数据 int maxX = n-1; //x轴的最大下标 int maxY = n-1; //Y轴的最大下标 int minX = 0; //x轴的最小下标 int minY = 0; //Y轴的最小下标 while(minX<=maxX) { for(int x=minX;x<=maxX;x++) { arr[minY][x] = ++count; } minY++; for(int y=minY;y<=maxY;y++) { arr[y][maxX] = ++count; } maxX--; for(int x=maxX;x>=minX;x--) { arr[maxY][x] = ++count; } maxY--; for(int y=maxY;y>=minY;y--) { arr[y][minX] = ++count; } minX++; } for(int i=0;i<arr.length;i++) { for(int j=0;j<arr.length;j++) { String space = (arr[i][j]+"").length()==1 ? "0":""; System.out.print(space+arr[i][j]+" "); } System.out.println(); } } } |

相关推荐
shinelord明1 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
新手小袁_J7 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅7 分钟前
C#关键字volatile
java·redis·c#
დ旧言~8 分钟前
专题八:背包问题
算法·leetcode·动态规划·推荐算法
Monly218 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
Ttang2310 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
钱多多_qdd21 分钟前
spring cache源码解析(四)——从@EnableCaching开始来阅读源码
java·spring boot·spring
waicsdn_haha23 分钟前
Java/JDK下载、安装及环境配置超详细教程【Windows10、macOS和Linux图文详解】
java·运维·服务器·开发语言·windows·后端·jdk
_WndProc25 分钟前
C++ 日志输出
开发语言·c++·算法
薄荷故人_27 分钟前
从零开始的C++之旅——红黑树及其实现
数据结构·c++