EduCoder Java入门 - 数组进阶

第1关:数组的复制

任务描述

本关任务:完成将一个数组的值复制给另一个数组。

相关知识

本关需要你完成数组的复制操作,可以分三个步骤来实现。

  1. 创建一个数组arr2,数组长度和数组arr1相同;

  2. 使用循环将数组1中的每一个数据赋值给数组2中对应的那一项。(即arr2[0] = arr1[0]);

  3. 循环输出复制之后arr2中的所有数据。

编程要求

在右侧编辑器Begin-End中填充代码,将arr1数组中的数据全部复制给arr2数组,最后输出arr2中所有的数据。

测试说明

我会对你的程序进行测试,如下: 测试输入:1312 预期输出: 1 3 12 测试输入:21311 预期输出: 2 13 11

package step1;

import java.util.Scanner;

public class HelloWorld {
	public static void main(String[] args) {
		//动态构建arr1
		int[] arr1 = new int[3];
		Scanner sc = new Scanner(System.in);
		for(int i = 0 ; i< arr1.length ; i++){
			arr1[i] = sc.nextInt();
		}
		/********** Begin **********/
		//创建数组arr2
        int[] arr2 = new int[arr1.length];

        //使用for循环将arr1的数据复制给arr2

        for (int j = 0; j < arr1.length; j++) {
            arr2[j] = arr1[j];
        }

        //输出arr2
        for (int array : arr2)
            System.out.println(array);
		/********** End **********/
	}
}

第2关:数组中元素的查找

任务描述

本关任务:完成查找字符串数组中指定字符串位置的小程序。

相关知识

为了完成本关任务,你需要知道:如何判断两个字符串是否相等。

如何判断字符串相等

我们之前判断两个数是否相等使用的是==符号,我们判断字符串是否相等能否用==符号呢?我们来看一段代码。

输出结果:

为什么呢? 是因为==比较的是两个对象的内存地址,我们知道变量被创建的时候就相当于在内存中开辟空间,而案例中strstr1就是占用的两块不同的空间,所以他们的内存地址是不一致的,在用==符号判断的时候就不相等了,即为false

也许你会这样子尝试:

这个时候的输出结果就可能会让你感觉疑惑:

这又是什么原因呢?是因为定义String str = "hello"String str1 = "hello"没有进行对象的创建,而是同时指向的一个对象,所以他们的内存地址是相同的。

问题来了,既然==不能用,那我们应该用什么呢?

Java中判断两个字符串是否相等,需要使用equals方法

语法:字符串1.equals(字符串2) 如果字符串1等于字符串2返回true,否则返回false; 例如:

输出: str与str1是否相等true

编程要求

在右侧编辑器Begin-end处填充代码,实现在数组中查找指定字符串位置的功能。

测试说明

测试输入:张三 预期输出:张三在数组的第1个位置

测试输入:张富贵 预期输出:张富贵在数组的第5个位置

package step2;

import java.util.Scanner;

public class HelloWorld {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		//str为要查找的字符串
		String str = sc.next();
		
		/********** Begin **********/
		//创建数组   arr  给数组赋值 {"张三","张三丰","张无忌","王二麻子","张富贵"}
		String[] arr = {"张三", "张三丰", "张无忌", "王二麻子", "张富贵"};

        for (int i = 0; i < arr.length; i++) {
            int j = i + 1;
            if (str.equals(arr[i]))
                System.out.println(str + "在数组的第" + j + "个位置");
        }
		
		/********** End **********/
	}
}

第3关:交换算法

任务描述

本关任务:完成两个数(ab)的交换。

相关知识

看到这个问题,也许你的第一想法就是:

 
  1. int a = 3;
  2. int b = 4;
  3. a = b;
  4. b = a;
  5. System.out.println(a);
  6. System.out.println(b);

问题真有那么简单吗?猜猜这段程序输出的结果吧!

我们在之前的章节中提到过,变量就相当于一个杯子,每一个变量相当于不同的杯子,本关要完成的两个变量的交换,可以看做是将两个杯子中装的液体进行交换,请你思考一下如何将两个杯子中的液体交换呢?

只有两个杯子能不能完成呢?

如果是三个杯子呢?

编程要求

是时候检验一下啦,在右侧编辑器Begin-end中填充代码,完成两个变量的交换吧。

测试说明

测试输入:35 预期输出: 5 3 测试输入:4,2 预期输出: 2 4

package step3;

import java.util.Scanner;

public class HelloWorld {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int a = sc.nextInt();
		int b = sc.nextInt();
		/********** Begin **********/
		//将a的值赋给b   b的值赋给a
		
		int temp=a;
        a=b;
        b=temp;

		/********** End **********/
		System.out.println(a);
		System.out.println(b);
	}
	
}

第4关:选择排序

任务描述

本关任务:实现数组从大到小的排序(降序排序)。

相关知识

为了解决数组排序的问题你需要先了解:选择排序。

选择排序

关于选择排序,你可以理解为一个循环打擂台的过程,还记得我们在上一章节中求数组中的最大值吗?

我们运用打擂台的原理,可以求出数组中的最大值。 核心代码:

 
  1. int max = scores[0];
  2. for (int i = 1; i < scores.length; i++) {
  3. if(max < scores[i]){ //求最大值
  4. max = scores[i];
  5. }
  6. }

这样一轮循环之后我们就可以求出数组scores的最大值。 第一轮擂台赛求出最大值之后,我们可以对接下来的数据再进行打擂台的操作,就出剩下数据的最大值(也就是第二大的值),以此类推,就可以实现数组从大到小的排序。

实现过程

为了实现选择排序,我们需要求出最大值,并且和相比较的数据交换位置:接下来我们对数组int[] arr = {6,5,8,0,2,9}来进行第一趟循环,将最大值移动到数组的第一位。

代码实现:

 
  1. int[] arr = {6,5,8,0,2,9};
  2.  
  3. for (int i = 0; i < arr.length-1; i++) {
  4. if(arr[0] < arr[i+1]){
  5. int temp = arr[0];
  6. arr[0] = arr[i+1];
  7. arr[i+1] = temp;
  8. }
  9. }

一次循环操作就可以找出数组中的最大值,并将其移动到数组的首位,所以对于一个长度为6的数组,我们只需要进行5(length-1)次上述操作即可将数组降序排序了。

接下来我们进行第二趟循环,求第二大的值,并将其移动到数组的第二个位置。因为我们已经求出了最大值,所以这一次循环,最大值不用参与比较。

代码实现:

结果:[9, 8, 5, 0, 2, 6]

可以发现经过两轮循环我们找出了数组中最大的两个值,并且移动他们到了数组的前两位。

现在按照上述步骤就可以实现数组的排序了,不过如果我们照搬上述代码,就会有很多冗余的代码,所以需要你来改进,怎么改进是需要你思考的。

告诉你一个秘密:使用Arrays.toString(数组)可以直接输出数组中的值哦! 如下:

输出结果:[6, 5, 8, 0, 2, 9]

思考题

本关所讲述的选择排序是一个简化版本,如果你想要学习优化版可以根据下列图片,编写出相应代码,然后在评论区贴出来哦。

上图就是一个使用选择排序将一个数组中数据从小到大排序的过程,请思考如何用代码实现上述过程。

原理:每一次从待排序的数据元素中选出最小的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。


本关难度较大,但这是学习数组绕不过去的一关,多思考,多尝试,你能成功的,加油!

编程要求

在右侧Begin-End区域中添加代码,实现对数组arr的降序排序,并输出排序后的arr数组。

测试说明

我会对你的程序进行测试; 预期输入:6650289 预期输出:[9, 8, 6, 5, 2, 0]

预期输入:4312113 预期输出:[13, 12, 3, 1]

package step4;

import java.util.Arrays;
import java.util.Scanner;

public class HelloWorld {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//动态创建数组
		int[] arr = new int[sc.nextInt()];
		for(int i = 0 ; i< arr.length ; i++){
			arr[i] = sc.nextInt();
		}
		/********** Begin **********/
		for (int i = 0; i < arr.length - 1; i++) {
            int k = i;
            for (int j = k + 1; j < arr.length; j++) {
                if (arr[j] > arr[k]) {
                    k = j;
                }
            }
            if (i != k) {
                int temp = arr[i];
                arr[i] = arr[k];
                arr[k] = temp;
            }
        }
        System.out.println(Arrays.toString(arr));	
		
		/********** End **********/
	}
}

第5关:冒泡排序

任务描述

本关任务:使用冒泡排序实现数组的升序排序(从小到大)。

相关知识

冒泡排序

看完上图,相信你已经能明白冒泡排序的原理了。

将序列当中的左右元素,依次比较,如果左边的元素大于右边元素则交换位置,保证右边的元素始终大于左边的元素;( 第一轮结束后,序列最后一个元素一定是当前序列的最大值;)对序列当中剩下的n-1个元素再次执行步骤1。对于长度为n的序列,一共需要执行n-1轮比较。

在代码中实现一轮比较:

输出结果:[5, 8, 0, 2, 6, 9]

编程要求

在编辑器Begin-end处填充代码,使用冒泡排序对数组arr进行升序排序,最后输出排序之后数组arr中的数据。

测试说明

预期输入:6958026 预期输出:[0, 2, 5, 6, 8, 9]

预期输入:4312130 预期输出:[0, 3, 12, 13]

package step5;

import java.util.Arrays;
import java.util.Scanner;

public class HelloWorld {
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//动态创建数组
		int[] arr = new int[sc.nextInt()];
		for(int i = 0 ; i< arr.length ; i++){
			arr[i] = sc.nextInt();
		}
		/********** Begin **********/
	    for (int i = 0; i < arr.length - 1; i++) {
            for (int j = 0; j < arr.length - i - 1; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
		
		/********** End **********/
	}
}	

 

### 回答1: Java数组是一种存储多个相同数据类型的变量的容器。它可以用来存储基本数据类型,例如int、float等,也可以用来存储对象。在Java数组是对象,因此它有一些特殊的属性和方法。 创建数组的语法格式如下: ``` 数据类型[] 数组名; 或 数据类型 数组名[]; ``` 例如: ``` int[] arr; 或 int arr[]; ``` 初始化数组 ``` 数据类型[] 数组名 = new 数据类型[数组长度]; ``` 例如: ``` int[] arr = new int[5]; ``` 访问数组元素 ``` 数组名[下标]; ``` 例如: ``` arr[0] = 1; ``` 请注意,在Java数组的下标是从0开始的。 我希望这对你有帮助。 ### 回答2: Java是一门非常流行的编程语言,它以其良好的跨平台性和强大的面向对象特性被广泛使用。在Java编程数组是一个非常基础的概念。在educoderJava入门课程,也着重讲解了数组的相关知识。以下是我对Java入门数组基础的一些理解和总结: 1. 数组是一组相同类型的数据元素的集合,它们在存储空间上是连续的。 2. 声明数组需要指定数组类型和数组名,例如:int[] numArray; 3. 数组元素的下标从0开始,例如numArray[0]表示数组的第一个元素。 4. 可以通过循环结构遍历数组中的所有元素,例如: for(int i=0;i<numArray.length;i++){ System.out.println(numArray[i]); } 5. 数组也可以作为方法的参数传递,例如: public static void printArray(int[] arr){ for(int i=0;i<arr.length;i++){ System.out.println(arr[i]); } } 6. Java提供了一些方便的数组操作方法,例如: Arrays.sort(numArray); //对数组进行升序排序 Arrays.fill(numArray,0); //将数组所有元素赋值为0 7. 多维数组是由一维数组作为元素的数组,可以看做数组数组。例如: int[][] matrix = new int[2][3]; matrix[0][0] = 1; matrix[1][2] = 2; 在使用数组时,我们需要注意数组越界等问题,同时要注意数组的初始化和赋值。掌握数组的基础知识,可以为我们后续的Java编程打下良好的基础。 ### 回答3: Java是一种高级编程语言,可以用于多种应用程序的开发。其数组Java最常用的数据结构之一,也是Java编程比较基础的概念之一。 数组是一组相同类型的数据的集合,这个集合的每个数据项都有自己的索引(下标),可以通过索引来访问和修改数组中的元素。通过使用数组,可以快速地将一组数据存储在内存,并对它们进行操作和管理。 Java数组是由一个固定长度的有序元素序列组成。在Java数组的长度是固定不变的,一旦初始化后,就不能再改变数组的长度。 在Java数组的声明和初始化很简单。例如,可以创建一个整形数组,它的长度是10,用以下代码表示: int[] arr = new int[10]; 这个数组被声明为一个整数数组,它的长度是10。其,int[]是数组类型的声明,arr是数组的名称,new int[10]是数组元素的类型和数量。 此外,Java还提供了许多有用的数组操作方法,如数组拷贝,数组排序,数组查找等等。使用这些方法可以使得对数组的操作更加方便和高效。 总之,掌握数组的基本概念和使用方法是Java编程的重要基础之一,对于想要学习Java编程的初学者来说,建议先从简单的数组基础开始学习,逐步深入掌握Java编程。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我这么好看

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值