关于数组的常见算法

一、案例一

|------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例:定义一个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 int10; //2. 通过循环给数组元素赋值 for (int i = 0; i < arr.length; i++) { arri = (int)(Math.random() * (99 - 10 + 1)) + 10; System.out.print(arri + "\t"); } System.out.println(); //3.1 求最大值 int max = arr0; for (int i = 1; i < arr.length; i++) { if(max < arri){ max = arri; } } System.out.println("最大值为:" + max); //3.2 求最小值 int min = arr0; for (int i = 1; i < arr.length; i++) { if(min > arri){ min = arri; } } System.out.println("最小值为:" + min); //3.3 求总和 int sum = 0; for (int i = 0; i < arr.length; i++) { sum += arri; } 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 = scores0; int min = scores0; for (int i = 0; i < scores.length; i++) { sum += scoresi; //累加总分 //用于获取最高分 if(max < scoresi){ max = scoresi; } //用于获取最低分 if(min > scoresi){ min = scoresi; } } 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 = arr0; for(int i=1; i<arr.length; i++){ if(arri > max){ max = arri; } } System.out.println("最大值是:" + max); System.out.print("最大值的下标有:"); //遍历数组,看哪些元素和最大值是一样的 for(int i=0; i<arr.length; i++){ if(max == arri){ 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 = arr0; String index = "0"; for(int i=1; i<arr.length; i++){ if(arri > max){ max = arri; index = i + ""; }else if(arri == max){ index += "," + i; } } System.out.println("最大值是" + max); System.out.println("最大值的下标是" + index+""); } } |

四、案例四

|------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 案例:使用二维数组打印一个 10 行杨辉三角。 提示: 1. 第一行有 1 个元素, 第 n 行有 n 个元素 2. 每一行的第一个元素和最后一个元素都是 1 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素。即: yanghuiij = yanghuii-1j-1 + yanghuii-1j; |
| 代码实现 | public class YangHuiTest { public static void main(String\[\] args) { //1. 创建二维数组 int\[\]\[\] yangHui = new int10\[\]; //2.使用循环结构,初始化外层数组元素 for(int i = 0;i < yangHui.length;i++){ yangHuii = new inti + 1; //3. 给数组的元素赋值 //3.1 给数组每行的首末元素赋值为1 yangHuii0 = yangHuiii = 1; //3.2 给数组每行的非首末元素赋值 //if(i >= 2){ for(int j = 1;j < yangHuii.length - 1;j++){ //j从每行的第2个元素开始,到倒数第2个元素结束 yangHuiij = yangHuii - 1j + yangHuii - 1j - 1; } //} } //遍历二维数组 for (int i = 0; i < yangHui.length; i++) { for (int j = 0; j < yangHuii.length; j++) { System.out.print(yangHuiij + "\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中的偶索引元素,使其等于索引值(如array0=0,array2=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(array1i + "\t"); } //(4)赋值array2变量等于array1,修改array2中的偶索引元素,使其等于索引值(如array0=0,array2=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){ array2i = i; } } System.out.println();//换行 //(5)打印出array1。 for (int i = 0; i < array1.length; i++) { System.out.print(array1i + "\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(array1i + "\t"); } //(4)复制array1数组给array2,修改array2中的偶索引元素,使其等于索引值(如array0=0,array2=2)。 array2 = new intarray1.length; for (int i = 0; i < array1.length; i++) { array2i = array1i; } System.out.println(); System.out.println(array1); System.out.println(array2); for (int i = 0; i < array2.length; i++) { if(i % 2 == 0){ array2i = i; } } System.out.println();//换行 //(5)打印出array1。 for (int i = 0; i < array1.length; i++) { System.out.print(array1i + "\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(arri + "\t"); } System.out.println(); //反转操作 //方式1: for(int i = 0;i < arr.length/2;i++){ //交互arri 与 arrarr.length - 1 - i位置的元素 int temp = arri; arri = arrarr.length - 1 - i; arrarr.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(arri + "\t"); } System.out.println(); //反转操作 //方式2: for(int i = 0,j = arr.length - 1;i < j;i++,j--){ //交互arri 与 arrj位置的元素 int temp = arri; arri = arrj; arrj = 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(arri + "\t"); } System.out.println(); //反转操作 //方式3:不推荐 int\[\] newArr = new intarr.length; for(int i = arr.length - 1;i >= 0;i--){ newArrarr.length - 1 - i = arri; } arr = newArr; //遍历 for (int i = 0; i < arr.length; i++) { System.out.print(arri + "\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++){ // arri = arri / arr0; // } for(int i = arr.length -1;i >= 0;i--){ arri = arri / arr0; } //遍历arr for(int i = 0;i < arr.length;i++){ System.out.print(arri + " "); } } } |

七、案例七

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

八、案例八:回形数

|-------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
| 案例说明 | 从键盘输入一个整数(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 intlenlen; 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 && arrij == 0){ arrij++ = m; }else{ k = 2; i++; j--; m--; } }else if(k == 2){ if(i < len && arrij == 0){ arri++j = m; }else{ k = 3; i--; j--; m--; } }else if(k == 3){ if(j >= 0 && arrij == 0){ arrij-- = m; }else{ k = 4; i--; j++; m--; } }else if(k == 4){ if(i >= 0 && arrij == 0){ arri--j = m; }else{ k = 1; i++; j++; m--; } } } //遍历 for(int m = 0;m < arr.length;m++){ for(int n = 0;n < arrm.length;n++){ System.out.print(arrmn + "\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 intnn; 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++) { arrminYx = ++count; } minY++; for(int y=minY;y<=maxY;y++) { arrymaxX = ++count; } maxX--; for(int x=maxX;x>=minX;x--) { arrmaxYx = ++count; } maxY--; for(int y=maxY;y>=minY;y--) { arryminX = ++count; } minX++; } for(int i=0;i<arr.length;i++) { for(int j=0;j<arr.length;j++) { String space = (arrij+"").length()==1 ? "0":""; System.out.print(space+arrij+" "); } System.out.println(); } } } |

相关推荐
To_OC8 小时前
LC 207 课程表:刚学图论那会儿,我连这是拓扑排序都没看出来
javascript·算法·leetcode
To_OC8 小时前
LC 208 实现 Trie 前缀树:曾被名字劝退,写完发现是送分题
javascript·算法·leetcode
BadBadBad__AK10 小时前
线段树维护区间 k 次方和
c++·数学·算法·stl
吃饱了得干活14 小时前
Spring Cloud Gateway 微服务网关:路由、断言、过滤器
java·spring cloud
lwx5728016 小时前
探秘InnoDB:搞懂它的内存、线程、磁盘与日志刷盘策略
java·后端
Flynt17 小时前
从Spring Boot 4.0升到4.1,我在Maven和gRPC上栽了跟头
java·spring boot·后端
plainGeekDev18 小时前
Activity 间传值 → Navigation 参数
android·java·kotlin
plainGeekDev18 小时前
onActivityResult → ActivityResult API
android·java·kotlin
Sunia18 小时前
《AgentX 专栏》10-生产部署:3台2C4G云服务器把企业级Agent真正跑起来的完整方案
java·架构
ZhengEnCi19 小时前
J7A-高级Java工程师面试三道灵魂拷问-深度广度与工程素养的终极检验
java·后端