幼儿园分班

一、题目描述

幼儿园两个班的小朋友排队时混在一起,每位小朋友都有一个编号,且明确标识自己是否与前一位小朋友同班(Y 表示同班,N 表示不同班)。

需根据该标识将小朋友划分到两个班级,并满足以下输出规则:

  1. 每个班级的小朋友编号按升序排列;
  2. 第一个编号更小的班级排在第一行,第二个班级排在第二行;
  3. 若仅一个班级,第二行为空行;
  4. 输入不符合要求时直接输出 ERROR。

二、输入输出描述

输入描述

输入为空格分隔的字符串,每个字符串格式为 编号/标志(如 6/N 2/Y 3/N 4/Y).

备注:

  • 小朋友总数 ≤ 999;
  • 编号范围:1 ≤ 编号 ≤ 999;
  • 标志仅为 Y 或 N;
  • 第一个小朋友无 "前一位",其标志无实际意义(需做合法性校验)。

输出描述

  • 第一行:第一个编号更小的班级的升序编号(空格分隔);
  • 第二行:第二个班级的升序编号(空格分隔),若无则为空行;
  • 非法输入输出 ERROR。

三、示例

|----|---------------------------------------------------------------------------------|
| 输入 | 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/N 2/Y 3/N 4/Y 5/Y |
| 输出 | 1 2 3 4 5 |
| 说明 | 2的同班标记为Y,因此和1同班。 3的同班标记为N,因此和1、2不同班。 4的同班标记为Y,因此和3同班。 所以1、2同班,3、4同班,输出为 1 2 3 4 |

四、解题思路

  1. 核心思想

通过 "临时列表控制优先班级顺序" 的方式,动态调整编号的班级分配规则:标记Y保持分配顺序,标记N反转分配顺序,最终对两个班级的编号按数字升序排序输出 ------ 核心是 "用列表反转模拟班级分配顺序切换,简化条件判断逻辑"。

  1. 问题本质分析
  • 表层问题:根据标记动态分配编号到两个班级,最终排序输出;
  • 深层问题:
    1. 动态分配规则的实现:标记N本质是 "交换下一个编号的分配目标班级",用列表反转可高效实现这一逻辑,无需频繁判断 "当前该分配到哪个班";
    2. 编号排序:需将字符串形式的编号按数字大小升序排列(而非字符串字典序);
    3. 边界处理:空班级无需输出,避免无效打印。
  1. 核心逻辑
  • 初始分配:第一个编号固定入 A 班,初始化临时列表temp为 A,B(A 为优先班级);
  • 动态切换:标记N时反转temp(交换优先班级),标记Y时保持;
  • 统一分配:无论标记如何,编号始终加入temp.get(0)(当前优先班级),简化分配逻辑;
  • 排序输出:按数字升序排序班级编号,非空则输出。
  1. 步骤拆解

  2. 输入初始化:

    • 分割输入为 "编号 / 标记" 数组,提取第一个编号加入 A 班;
    • 初始化临时列表temp,按 A,B 顺序存储两个班级。
  3. 动态分配编号:

    • 遍历后续每个 "编号 / 标记":
      1. 标记为N时,反转temp列表(切换优先班级);
      2. 将编号加入temp.get(0)(当前优先班级)。
  4. 排序处理:

    • 对 A、B 班的编号,按 "字符串转整数后升序" 的规则排序。
  5. 结果输出:

    • 非空班级按空格拼接编号并输出,空班级跳过。

五、代码实现

java 复制代码
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String[] nums = scanner.nextLine().split(" ");

        String[] start = nums[0].split("/");
        List<String> class_A = new ArrayList<>();
        class_A.add(start[0]);
        List<String> class_B = new ArrayList<>();

        List<List<String>> temp = new ArrayList<>();
        temp.add(class_A);
        temp.add(class_B);

        for (int i = 1; i < nums.length; i++) {
            String[] current = nums[i].split("/");
            String id_ = current[0];
            String f = current[1];

            if (f.equals("Y")) {
                temp = temp;
            } else {
                Collections.reverse(temp);
            }

            temp.get(0).add(id_);
        }

        if (!class_A.isEmpty()) {
            Collections.sort(class_A, (a, b) -> Integer.parseInt(a) - Integer.parseInt(b));
            System.out.println(String.join(" ", class_A));
        }

        if (!class_B.isEmpty()) {
            Collections.sort(class_B, (a, b) -> Integer.parseInt(a) - Integer.parseInt(b));
            System.out.println(String.join(" ", class_B));
        }
    }
}
相关推荐
jktantan11 分钟前
注解式脱敏:用 Jackson 的 ContextualSerializer 做字段级策略(一)
spring boot·后端·算法·spring cloud·系统架构
独泪了无痕9 小时前
探索Pinyin4j-Java中的拼音转换利器
java·后端
道尔柯南10 小时前
C++ string 类详解:从常用接口到深拷贝,彻底掌握字符串处理
android·java·c++
岁月宁静11 小时前
AI 应用开发工程师简历怎么写:HR 初筛、技术复筛、面试追问,三道关卡各看什么?
人工智能·python·面试
kingx311 小时前
Bugku 3122 谷歌小恐龙题解:纯离线逆向 Vault 的 AES-GCM 加密资源(附 Python 解密器)
java·逆向·ctf·bugku·aes-gcm
Dream it possible!13 小时前
LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)
算法·leetcode·面试·动态规划
DevOpenClub13 小时前
职教高考控制线 API:招生类别枚举、筛选与空分数含义
java·数据库·高考
心抵鹊13 小时前
算法之双指针系列(一)
算法·leetcode
十二13 小时前
【洛谷题解】P1083 [NOIP 2012 提高组] 借教室(二分答案 + 差分)
数据结构·c++·算法·蓝桥杯
露天赏雪14 小时前
第3篇:Sentinel熔断降级实战:大模型接口抖动时的服务兜底方案
java·开发语言·人工智能·spring boot·spring·servlet·sentinel