当前位置:   article > 正文

Educoder/头歌JAVA实训——JAVA入门:数组进阶_在右侧编辑器begin-end中填充代码,将arr1数组中的数据全部复制给arr2数组,最后输

在右侧编辑器begin-end中填充代码,将arr1数组中的数据全部复制给arr2数组,最后输

第1关:数组的复制

相关知识

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

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

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

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

编程要求

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

  1. package step1;
  2. import java.util.Scanner;
  3. public class HelloWorld {
  4. public static void main(String[] args) {
  5. //动态构建arr1
  6. int[] arr1 = new int[3];
  7. Scanner sc = new Scanner(System.in);
  8. for(int i = 0 ; i< arr1.length ; i++){
  9. arr1[i] = sc.nextInt();
  10. }
  11. /********** Begin **********/
  12. //创建数组arr2
  13. int[]arr2=new int[3];
  14. //使用for循环将arr1的数据复制给arr2
  15. for(int i=0;i<3;i++){
  16. arr2[i]=arr1[i];
  17. }
  18. //输出arr2
  19. for(int i=0;i<3;i++){
  20. System.out.println(arr2[i]);
  21. }
  22. /********** End **********/
  23. }
  24. }

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

相关知识

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

如何判断字符串相等

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

输出结果:

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

也许你会这样子尝试:

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

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

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

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

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

输出: str与str1是否相等true

测试说明

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

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

  1. package step2;
  2. import java.util.Scanner;
  3. public class HelloWorld {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. //str为要查找的字符串
  7. String str = sc.next();
  8. /********** Begin **********/
  9. //创建数组 arr 给数组赋值 {"张三","张三丰","张无忌","王二麻子","张富贵"}
  10. String[] arr = {"张三","张三丰","张无忌","王二麻子","张富贵"};
  11. for(int i=0;i<5;i++){
  12. if(str.equals(arr[i])){
  13. System.out.println( str+ "在数组的第" + (i+1) + "个位置" );
  14. }
  15. }
  16. /********** End **********/
  17. }
  18. }

第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);

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

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

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

如果是三个杯子呢?

  1. package step3;
  2. import java.util.Scanner;
  3. public class HelloWorld {
  4. public static void main(String[] args) {
  5. Scanner sc = new Scanner(System.in);
  6. int a = sc.nextInt();
  7. int b = sc.nextInt();
  8. /********** Begin **********/
  9. //将a的值赋给b b的值赋给a
  10. int t=a;
  11. a=b;
  12. b=t;
  13. /********** End **********/
  14. System.out.println(a);
  15. System.out.println(b);
  16. }
  17. }

第4关:选择排序

任务描述

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

相关知识

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

选择排序

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

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

  1. int ma = 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. for (int i = 0; i < arr.length-1; i++) {
  3. if(arr[0] < arr[i+1]){
  4. int temp = arr[0];
  5. arr[0] = arr[i+1];
  6. arr[i+1] = temp;
  7. }
  8. }

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

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

代码实现:

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

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

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

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

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

思考题

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

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

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

  1. package step4;
  2. import java.util.Arrays;
  3. import java.util.Scanner;
  4. public class HelloWorld {
  5. public static void main(String[] args) {
  6. Scanner sc = new Scanner(System.in);
  7. //动态创建数组
  8. int[] arr = new int[sc.nextInt()];
  9. for(int i = 0 ; i< arr.length ; i++){
  10. arr[i] = sc.nextInt();
  11. }
  12. /********** Begin **********/
  13. int max=0;
  14. int ch=-1;
  15. int[] a=new int[arr.length];
  16. for(int i=0;i<arr.length;i++){
  17. for(int j=0;j<arr.length;j++){
  18. if(arr[j]>max){
  19. max=arr[j];
  20. ch=j;
  21. }
  22. }
  23. arr[ch]=0;
  24. a[i]=max;
  25. max=-1;
  26. ch=-1;
  27. }
  28. System.out.println(Arrays.toString(a));
  29. /********** End **********/
  30. }
  31. }

第5关:冒泡排序

相关知识

冒泡排序

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

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

在代码中实现一轮比较:

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

  1. package step5;
  2. import java.util.Arrays;
  3. import java.util.Scanner;
  4. public class HelloWorld {
  5. public static void main(String[] args) {
  6. Scanner sc = new Scanner(System.in);
  7. //动态创建数组
  8. int[] arr = new int[sc.nextInt()];
  9. for(int i = 0 ; i< arr.length ; i++){
  10. arr[i] = sc.nextInt();
  11. }
  12. /********** Begin **********/
  13. for(int i=0;i<arr.length;i++){
  14. for(int j=0;j<arr.length-i-1;j++){
  15. if(arr[j]>arr[j+1]){
  16. int temp=arr[j];
  17. arr[j]=arr[j+1];
  18. arr[j+1]=temp;
  19. }
  20. }
  21. }
  22. System.out.println(Arrays.toString(arr));
  23. /********** End **********/
  24. }
  25. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/567496
推荐阅读
相关标签
  

闽ICP备14008679号