我是靠谱客的博主 长情人生,最近开发中收集的这篇文章主要介绍幼儿园分班问题 【Java】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

幼儿园分班问题 【Java】

题目描述

幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。

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

输入描述

输入由空格分开的小朋友编号和是否同班的标志,如:

6/N 2/Y 3/N 4/Y 表示一共有4位小朋友

2和6是同班,3和2不同班,4和3同班。

小朋友总数<999

不考虑输入格式错误。

输出描述

输出每个班级的小朋友编号,用空格隔开

输出结果按编号大小升序排列

第一个分班的小朋友编号较小的排在第一队,输出在第一行

若只有一个班级,则第二行为空

若输入不符合要求,则输出“ERROR"

示例1

  • 输入

    1/N 2/Y 3/N 4/Y
    
  • 输出

    1 2
    3 4
    
  • 说明

    2和1同一班,3与2不是同一个班,4和3同一班
    

解题思路

  1. 用一个对象表示一个小朋友在队伍的位置信息,然后统计每个小朋友的班级编号
  2. 分班到两个集合
  3. 对输出要求进行输出即可,注意排序
  4. 对输入异常(编号不能小于0,不能大于999)时,结束程序,并输出ERROR

代码

import java.util.*;

public class Main {
    public static void main(String[] args) {
        // 处理输入
        Scanner input = new Scanner(System.in);
        String line = input.nextLine();
        String[] split = line.split(" ");
        Node[] nodes = new Node[split.length];
        boolean isFailed = false;
        for (int i = 0; i < split.length; i++) {
            String[] one = split[i].split("/");
            nodes[i] = new Node(Integer.parseInt(one[0]), Objects.equals(one[1], "Y"));
            if (nodes[i].value < 0 || nodes[i].value > 999) {
                isFailed = true;
            }
        }
        if (isFailed) {
            System.out.println("ERROR");
            return;
        }

        // 先让第一个人加入1队
        nodes[0].clazz = 1;
        for (int i = 1; i < nodes.length; i++) {
            // 从第二个人开始,看他是否和前面一个人是同一队
            if (nodes[i].isTrue) {
                // 如果是,则判断前面一个是不是1队,否则加入2队
                nodes[i].clazz = nodes[i - 1].clazz == 1 ? 1 : 2;
            } else {
                // 如果不是,则判断前面一个是不是1队,如果不是,则加入1队
                nodes[i].clazz = nodes[i - 1].clazz == 1 ? 2 : 1;
            }
        }

        // 上面已经确认每个人是属于哪个队伍,下面组装队伍,便于输出
        ArrayList<Integer> oneClass = new ArrayList<>();
        ArrayList<Integer> twoClass = new ArrayList<>();
        for (Node node : nodes) {
            if (node.clazz == 1) {
                oneClass.add(node.value);
            } else {
                twoClass.add(node.value);
            }
        }

        // 处理输出,1队肯定不为空,如果2队为空,则第二行输出换行符
        if (twoClass.isEmpty()) {
            // 输出
            System.out.println(listToString(oneClass));
            System.out.println();
            return;
        }

        // 第一个编号较小的队伍往前排,题目描述不是很清,如果是排序后再比较,可以自己适当修改下
        if (oneClass.get(0) < twoClass.get(0)) {
            System.out.println(listToString(oneClass));
            System.out.println(listToString(twoClass));
        } else {
            System.out.println(listToString(twoClass));
            System.out.println(listToString(oneClass));
        }
    }

    private static String listToString(List<Integer> list) {
        Collections.sort(list);
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < list.size(); i++) {
            sb.append(list.get(i));
            if (i != list.size() - 1) {
                sb.append(" ");
            }
        }
        return sb.toString();
    }

    private static class Node {
        int value;
        boolean isTrue;
        int clazz;

        public Node(int value, boolean isTrue) {
            this.value = value;
            this.isTrue = isTrue;
        }
    }
}

最后

以上就是长情人生为你收集整理的幼儿园分班问题 【Java】的全部内容,希望文章能够帮你解决幼儿园分班问题 【Java】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部