题目描述
有两个幼儿园班级的小朋友排队时混在一起了,每位小朋友都知道自己跟前面一位小朋友是否为同一班级,请将同班的小朋友找出来。小朋友以整数编号区分,并带有一个是否与前一位小朋友同班的标识,同班用Y表示,不同班用N表示。
输入
输入的数据以空格分开,每个数据包含小朋友的编号和是否同班的标识,且以“/”分隔。
如:6/N 2/Y 3/N 4/Y,表示4位小朋友,其中2和6同班,2和3不同班,3和4同班。
其中,小朋友总数不超过999,每个小朋友的0<编号<=999,忽略输入格式错误问题。
输出
输出为两行,分别是两个班的小朋友编号,每行的小朋友编号之间用空格分开,且满足下列条件:
1.编号需按照大小升序排序,分班记录中的第一个编号小的排在第一行;
2.若只有一个班的小朋友,第二行则为空;
3.若输入不符合要求,则输出字符串ERROR。
用例
分班逻辑解析
分班解析
假设两个班分别为class1和class2.
如果前面一位小朋友在class1,看后面一个小朋友的标识位
- 标识Y,则在class1,在同一班
- 标识N,则在class2,不在同一班
如果前面一位小朋友在class2,看后面一个小朋友的标识位
- 标识Y,则在class2,在同一班
- 标识N,则在class1,不在同一班
需要校验的情况如下,打印输出ERROR:
- 小朋友总数不超过999
- 0<小朋友编号<=999
- 同班标识只能是Y或N字符
- 对于第一个小朋友的标识,理论上只能是N,因为他前面没有其他小朋友了。
打印要求
- 一班、二班需要各自升序,且比较出第一个小朋友的编号较小的,则首先打印
- 如果二班没有小朋友,则打印空行
Java源码
import java.util.StringJoiner;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Arrays;
public class KidsClassesSort {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入所有排队的小朋友的数据(例2/Y):");
String[][] infos = Arrays.stream(sc.nextLine().split(" ")).map(s -> s.split("/")).toArray(String[][]::new);
//校验小朋友的总数
if(infos.length > 999){
System.out.println("ERROR");
return;
}
//创建class1和class2数组列表
ArrayList<Integer> class1 = new ArrayList<>();
ArrayList<Integer> class2 = new ArrayList<>();
boolean isClass1 = false;
//开始分班
for (int i = 0; i < infos.length; i++) {
String[] info = infos[i];//获取一个小朋友的编号和标识信息
//校验小朋友的编号
int id = Integer.parseInt(info[0]);//字符转化为整数
if(id <= 0 || id > 999){
System.out.println("ERROR");
return;
}
//校验小朋友的标识
String flag = info[1];
if(!"Y".equals(flag) && !"N".equals(flag)){
System.out.println("ERROR");
return;
}
//校验第一个小朋友的标识是否为N
if(i == 0 && "Y".equals(flag)){
System.out.println("ERROR");
return;
}
//按逻辑分班
if("Y".equals(flag) && isClass1 || "N".equals(flag) && !isClass1){
isClass1 = true;
class1.add(id);
}else {
isClass1 = false;
class2.add(id);
}
}
//将分班后的小朋友编号按大小升序排序
class1.sort((a,b) -> a - b);
class2.sort((a,b) -> a - b);
//将分班记录中第一个编号更小的排在第一行
if(class1.isEmpty() || !class2.isEmpty() && class1.get(0) > class2.get(0)){
ArrayList<Integer> tmp = class1;
class1 = class2;
class2 = tmp;
}
System.out.println("1班的小朋友编号:"+join(class1, " "));
System.out.println("2班的小朋友编号:"+join(class2, " "));
}
//打印结果
private static String join(ArrayList<Integer> list, String delimiter) {
StringJoiner sj = new StringJoiner(delimiter);
for(Integer i : list){
sj.add(i + "");
}
return sj.toString();
}
}