Educoder - Java入门 - 数组进阶各关卡题目总结

1、编程要求:

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

2、测试效果:

  我会对你的程序进行测试,如下:

  测试输入:1312

  预期输出:

  1

  3

  12

  测试输入:21311

  预期输出:

  2

  13

  11

3、程序设计思路:

 (1)数组的数组名中储存的实际是数组的地址值,所以不能用数组名直接复制。

 (2)采用for循环将arr1里面的元素循环赋予arr2里面的元素。

4、程序实现:

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[3];

        //使用for循环将arr1的数据复制给arr2
        for(int j =0 ; j<arr1.length ; j++){
           arr2[j] =arr1[j];
           System.out.println(arr2[j]);
        }
        /********** End **********/
    }
}

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

1、编程要求:

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

2、测试效果:

  测试输入:张三

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

  测试输入:张富贵

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

3、程序实现:

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 =new String[]{"张三","张三丰","张无忌","王二麻子","张富贵"};
        for(int i=0;i<5;i++){
            if(str.equals(arr[i])){
                System.out.println(str+"在数组的第"+(i+1)+"个位置");
            }
        }    
        /********** End **********/
    }
}

4、题目总结:

 (1)变量被创建的时候就相当于在内存中开辟空间,==比较的是两个对象的内存地址,重新创建的变量与原变量内存地址不同,所以不能用==比较。

 (2)若没有进行对象创建,而是仅仅对相同类型变量进行了两次声明,两个变量内存地址相同。

   如String str = "hello"String str1 = "hello"没有进行对象的创建,而是同时指向的一个对象,所以他们的内存地址是相同的。

第3关:交换算法

1、编程要求:

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

2、测试效果:

  测试输入:35

  预期输出:

  5

  3

  测试输入:4,2

  预期输出:

  2

  4

3、程序设计思路:

  两个变量数值的交换有三种换发:

 (1)借助中间量交换 (开发常用)  

    理解:三个杯子,两杯装水,其中一个空杯子用作容器。

int x = 10; 
int y = 20; 
int z = x; 
x = y; 
y = z; 

 (2)位移运算交换 (面试常用)

   理解:涉及到了异或运算符的规则:一个数对另一个数位异或两次,该数不变

int x = 10; 
int y = 20; 
x = x ^ y; 
y = x ^ y; 
x = x ^ y;

 (3)数值相加减交换

   理解:先求得两数的和再进行减运算

int x = 10; 
int y = 20; 
x = x + y; 
y = x - y; 
x = x - y; 

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 i =b;
        b=a;
        a=i;
        /********** End **********/
        System.out.println(a);
        System.out.println(b);
    }
    
}

第4关:选择排序

1、编程要求:

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

2、测试效果:

  我会对你的程序进行测试;

  预期输入:6650289

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

  预期输入:4312113

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

3、程序设计思路:

 (1)首先思考内层循环,对数组进行降序排序,也就是要将元素按从大到小排列到数组中,首先就是想办法把最大值放到首位。

 (2)首位解决了,要循环重复第(1)步操作,值得注意的是首位不需要考虑,所以在内层循环的变量初始值要做出改变。

4、程序实现:

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 j = 0; j < arr.length - 1; j++) {
            for (int i = j; i < arr.length -1; i++) {
                if(arr[j] < arr[i+1]){    
                    int temp = arr[j];
                    arr[j] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        /********** End **********/
    }
}

5、题目总结:

 (1)对于数组的输出有更简单的方法:Arrays.toString(数组)可以直接输出数组中的值。

 (2)选择排序更优化方法思考。

第5关:冒泡排序

1、编程要求:

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

2、测试效果:

  预期输入:6958026

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

  预期输入:4312130

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

3、程序设计思路:

  (1)将序列当中的左右元素,依次比较,如果左边的元素大于右边元素则交换位置,保证右边的元素始终大于左边的元素。

  (2) 第一轮结束后,序列最后一个元素一定是当前序列的最大值。

  (3)对序列当中剩下的n-1个元素再次执行步骤1。对于长度为n的序列,一共需要执行n-1轮比较。

4、程序实现:

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 j = 1 ; j< arr.length;j++){
            for (int i = 0; i < arr.length -j; i++) {
                if(arr[i] > arr[i+1]){
                    int temp = arr[i];//交换位置
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                }
            }
        }
        System.out.println(Arrays.toString(arr));
        /********** End **********/
    }
}