jmu-Java-02基本语法-01-综合小测验 PTA

jmu-Java-02基本语法-01-综合小测验 PTA

题目

运行程序后可以输入4个选项,分别为:fib,sort,search,getBirthDate

fib:根据输入n,打印斐波那契数列。比如输入:3,输出:1 1 2

sort:输入一串数字,然后进行排序并输出,注意数组元素输出的格式为使用[ ]包括。提示:可直接使用函数Arrays相关方法处理输出。

search:如果找到返回所找到的位置,如果没找到,返回-1。提示:可以先对数组排序,然后使用Arrays相关函数进行查找。

getBirthDate:输入n个身份证,然后把输入的n个身份号的年月日抽取出来,按年-月-日格式输出。

当输入不是这几个字符串(fib,sort,search,getBirthDate)的时候,显示exit并退出程序。

注意:在处理输入的时候,尽量全部使用Scanner的nextLine()方法接收输入,不要将nextLine()与其它next方法混用,否则可能会出现行尾回车换行未处理影响下次输入的情况。

参考:jdk文档的Arrays,String

输入格式:

fib
3
sort
-1 10 3 2 5
search
-1
search
0
getBirthDate
1
330226196605054190
e

输出格式:

1 1 2
[-1, 2, 3, 5, 10]
0
-1
1966-05-05
exit

分析

本题是综合小测验,考察了对Arrays类和字符串分割的掌握程度,比较基础。
需要注意的是Arrays.binarySearch(int[] a, int key)的返回值。

Arrays.binarySearch(int[] a, int key)的返回值:

  • 1.当a[]中存在key时,返回值为key在数组中的下标;
  • 2.当a[]中不存在key时,返回值为key在数组中负的插入点值。

举个例子,如:

int[] a = {2, 10, 20, 30, 100};
//使用Arrays.binarySearch()方法的数组,需要是已排序好的数组。否则返回值不定
System.out.println(Arrays.binarySearch(a, 1)); //返回值-1
System.out.println(Arrays.binarySearch(a, 5)); //返回值-2
System.out.println(Arrays.binarySearch(a, 21)); //返回值-4
System.out.println(Arrays.binarySearch(a, 28)); //返回值-4
System.out.println(Arrays.binarySearch(a, 30)); //返回值3

上面的代码中,

  • 1不在数组里面,而1在数组中是最小的数,如果把1插入数组,它应该插在数组的第1位,所以其插入点值为1,那么返回值就是-1
  • 5不在数组里面,而5是大于2小于10的,所以如果把5插入数组,它应该插在数组的第2位,所以其插入点值为2,那么返回值就是-2
  • 21,28同理可得插入点值为4,返回值为-4
  • 30在数组里面,所以返回它所在位置的下标3

所以我们调用Arrays.binarySearch(int[] a, int key)方法时,不能直接输出其返回值,而是应该判断一下:当返回值大于0时,直接输出返回值;当返回值小于0时,则返回-1.

答案

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

/**
 *
 * @author 梓叶枫林
 * @date 2020/11/02
 */
public class Main {

    public static void main (String [] args) {

        Scanner scanner = new Scanner(System.in);

        //创建自己的帮助类(帮助类在下面...)
        Helper helper = new Helper();

        while(scanner.hasNext()) {

            //接收字符串用于下面的判断
            String str = scanner.next();

            if ("fib".equals(str)) {

                helper.fib(scanner.nextInt());

            } else if ("sort".equals(str)) {

                //先将接下来的数字放在集合里面
                List<Integer> sortList = new ArrayList<>();
                while (scanner.hasNextInt()) {
                    sortList.add(scanner.nextInt());
                }

                //再将集合转换为数组传入函数
                helper.sort(sortList.toArray(new Integer[0]));

            } else if ("search".equals(str)) {

                helper.search(scanner.nextInt());

            } else if ("getBirthDate".equals(str)) {

                int n = scanner.nextInt();
                for (int i = 0; i < n; i++) {
                    String identityCardNum = scanner.next();
                    helper.getBirthDate(identityCardNum);
                }

            } else {
                //字符串为其他时退出程序
                System.out.println("exit");
                System.exit(0);
            }
        }
    }
}


class Helper {

    /**
     * 使用此数组存储下来sort后的数组,用于之后的search操作
     * */
    private Integer[] sortedArray;

    /**
     * 斐波拉契的处理方法
     * 这里使用了正向递推的方法实现斐波拉契数列
     * 实现斐波拉契数列的方法有好几种,网上资料很多,这里不再赘述
     * */
    void fib (int n) {

        if (n == 1) {
            System.out.println("1");
            return;
        } else if (n == 2) {
            System.out.println("1 1");
            return;
        }

        int[] num = new int[n];
        num[0] = 1; num[1] = 1;

        System.out.print("1 1");
        for (int i = 2; i < n; i++) {
            num[i] = num[i - 1] + num[i - 2];
            System.out.print(" " + num[i]);
        }
        System.out.println();
    }

    /**
     * 使用Java自带的排序算法进行排序
     * */
    void sort(Integer nums[]) {

        Arrays.sort(nums);
        sortedArray = nums;
        System.out.println(Arrays.toString(nums));
    }

    /**
     * 查询数组中是否含该元素
     * 注意:当数组中不存在查找值时,
     *      Arrays.binarySearch(int[] a, int key)的返回值不一定为-1
     *      所以需要判断一下:当返回值小于0时,则输出-1;当返回值大于0时,则输出返回值。
     * */
    void search(int searchNum) {
        int ret = Arrays.binarySearch(sortedArray, searchNum);
        if (ret < 0) {
            System.out.println(-1);
        } else {
            System.out.println(ret);
        }
    }

    /**
     * 使用字符串分割的方法提取生日信息
     * */
    void getBirthDate(String identityCardNum) {

        System.out.println(identityCardNum.substring(6, 10) + "-"
        + identityCardNum.substring(10, 12) + "-" + identityCardNum.substring(12, 14));

    }
}

版权声明:本文为qq_43427314原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。