题目
运行程序后可以输入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));
}
}