[华为OD]幼儿园两个班的小朋友 100

本文介绍了一个编程问题,如何根据小朋友之间的同班标识(Y/N)使用Java代码将他们分成两个班级,按照编号升序排列输出。作者提供了详细的解题思路和代码实现。
摘要由CSDN通过智能技术生成

题目:

幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友

是否同班,请你帮忙把同班的小朋友找出来。

小朋友的编号为整数,与前一位小朋友同班用 Y 表示,不同班用 N 表示。

输入描述:

输入为空格分开的小朋友编号和是否同班标志。

比如:6/N 2/Y 3/N 4/Y,表示共 4 位小朋友,2 和 6 同班,3 和 2 不同班,4 和 3 同班。

其中,小朋友总数不超过 999,每个小朋友编号大于 0,小于等于 999。

不考虑输入格式错误问题。

输出描述:

输出为两行,每一行记录一个班小朋友的编号,编号用空格分开。且:

1、编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行。

2、若只有一个班的小朋友,第二行为空行。

3、若输入不符合要求,则直接输出字符串 ERROR。

补充说明:

示例 1

输入:

1/N 2/Y 3/N 4/Y

输出:

1 2

3 4

说明:

2 的同班标记为 Y,因此和 1 同班。

3 的同班标记为 N,因此和 1、2 不同班。

4 的同班标记为 Y,因此和 3 同班。

所以 1、2 同班,3、4 同班,输出为

1 2

3 4

题解:

这个比较简单,建立两个动态数组表示1班和2班,然后在判断的时候,用一个bool值isClassOne表示当前指定的是1班,除了第一个小朋友默认为第一班以外,其余小朋友数据根据,Y,N值来变动,是Y的话,并且isClassOne = true的话,那么就是这个就是1班的,否则就是2班的,同时isClassOne翻转变为false,表示当前指定为2班。按照这个逻辑判断就可以了

代码实现:

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
import java.util.stream.Collectors;

public class SplitChild {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String[] childs = sc.nextLine().split(" ");
        List<Integer> class1 = new ArrayList<>();
        List<Integer> class2 = new ArrayList<>();
        boolean isClassOne = true;

        for (int i = 0; i < childs.length; i++) {
            String[] child = childs[i].split("/");
            boolean isSomeClass = child[1].equals("Y");
            if (i == 0) {
                isClassOne = true;
                class1.add(Integer.valueOf(child[0]));
                continue;
            }

            if (isSomeClass) {
                if (isClassOne) {
                    class1.add(Integer.valueOf(child[0]));
                } else {
                    isClassOne = false;
                    class2.add(Integer.valueOf(child[0]));
                }
            } else {
                if (isClassOne) {
                    isClassOne = false;
                    class2.add(Integer.valueOf(child[0]));
                } else {
                    isClassOne = true;
                    class1.add(Integer.valueOf(child[0]));
                }
            }
        }

        class1.stream().sorted().collect(Collectors.toList());
        class2.stream().sorted().collect(Collectors.toList());

        StringBuilder sb1 = new StringBuilder();
        StringBuilder sb2 = new StringBuilder();
        for (int i = 0; i < class1.size(); i++) {
            if (i != 0) {
                sb1.append(" ");
            }
            sb1.append(class1.get(i));
        }

        for (int j = 0; j < class2.size(); j++) {
            if (j != 0) {
                sb2.append(" ");
            }
            sb2.append(class2.get(j));
        }
        if (class2.size() > 0) {
            if (class1.get(0) < class2.get(0)) {
                System.out.println(sb1);
                System.out.println(sb2);
            } else {
                System.out.println(sb2);
                System.out.println(sb1);
            }
        }
        if (class2.size() == 0) {
            System.out.println(sb1);
        }
    }
}

输出验证:

 

  • 9
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值