• 华为OD机考算法题:分班


    题目部分

    题目分班
    难度
    题目说明幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。
    小朋友的编号为整数,与前一位小朋友同班用 Y 表示,不同班用 N 表示(第一位小朋友前面没人,用 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 行字符串,每条数据以空格分开。每条数据包含两部分:自己的编号 和 自己是否与前面的小朋友是否同班(使用 Y 表示同班,N 表示不同班。首位小朋友标记为 N)。

    输出 2 行,每行输出一个班的小朋友编号,如果全都在一个班,第二行为空行;每行的数据按照编号从小到大输出;两行数据中,第一个编号最小的数据放在第一行。

    分析与思路

    此题需要考虑输入错误的情况,所以此题包含步骤:验证输入,遍历输入数据进行分班,对分班数据排序,输出数据。具体如下:
    1. 验证输入。
    对输入字符串,以空位为分隔符进行分割,如果无法分割出数据,则输出 ERROR。
    逐个遍历分隔后的每条数据,对每条数据,继续以 "/" 进行分割,如果无法分割出数据,则输出 ERROR。对于分割后的数据,如果 "/" 之前的数据不是数字,则输出 ERROR;如果 "/" 之后的数据不是 "Y" 或 "N",则输出 "N"。首条数据的 "/" 之后为 "N"。
    2. 遍历输入数据进行分班。
    新建 2 个数组,把第一条数据编号放到第一个数组中,如果第二条数据的 "/" 之后是 "Y",则放到与前一条数据相同的数组,否则放到第二个数组。
    逐条遍历数据,对于每条数据,如果 "/" 是 "Y",则把这条数据的编号放到与前面一条数据相同的数组中,否则放到另外一条数组中。
    3. 对分班数据排序。
    对数组中的数据从小到大排序。
    4. 输出数据。
    如果其中一个数组为空,则输出其中一个数组,另外一个空行。
    如果两个数组均不为空,则判断两个数组的第一个元素大小,先输出第一个元素较小的数组。

    因涉及到排序,时间复杂度为 O(nlogn),空间复杂度为 O(n)。


    代码实现

    Java代码

    1. import java.util.Scanner;
    2. import java.util.List;
    3. import java.util.ArrayList;
    4. import java.util.Collections;
    5. /**
    6. * 篮球比赛
    7. *
    8. * @since 2023.09.15
    9. * @version 0.1
    10. * @author Frank
    11. *
    12. */
    13. public class ClassCheck {
    14. public static void main(String[] args) {
    15. Scanner sc = new Scanner(System.in);
    16. while (sc.hasNext()) {
    17. String input = sc.nextLine();
    18. processClassCheck(input);
    19. }
    20. }
    21. private static void processClassCheck(String input) {
    22. String[] kidsInfoStr = input.split(" ");
    23. if (kidsInfoStr == null || kidsInfoStr.length == 0) {
    24. System.out.println("ERROR");
    25. return;
    26. }
    27. List[] classInfo = new ArrayList[2];
    28. classInfo[0] = new ArrayList();
    29. classInfo[1] = new ArrayList();
    30. int curClass = 1;
    31. for (int i = 0; i < kidsInfoStr.length; i++) {
    32. String eachRecord = kidsInfoStr[i];
    33. String[] recordDetail = eachRecord.split("/");
    34. if (recordDetail == null || recordDetail.length != 2) {
    35. System.out.println("ERROR");
    36. return;
    37. }
    38. int num;
    39. try {
    40. num = Integer.parseInt(recordDetail[0]);
    41. } catch (NumberFormatException e) {
    42. System.out.println("ERROR");
    43. return;
    44. }
    45. if ("Y".equals(recordDetail[1])) {
    46. classInfo[curClass].add(num);
    47. } else if ("N".equals(recordDetail[1])) {
    48. curClass ^= 1;
    49. classInfo[curClass].add(num);
    50. } else {
    51. System.out.println("ERROR");
    52. return;
    53. }
    54. }
    55. Collections.sort(classInfo[0]);
    56. Collections.sort(classInfo[1]);
    57. if (classInfo[1].size() > 0 && classInfo[1].get(0) < classInfo[0].get(0)) {
    58. List tmp = classInfo[0];
    59. classInfo[0] = classInfo[1];
    60. classInfo[1] = tmp;
    61. }
    62. for (int i = 0; i < classInfo.length; i++) {
    63. if (classInfo[i].size() == 0) {
    64. // 如果为 0,一定是第二个
    65. System.out.println();
    66. break;
    67. }
    68. for (int j = 0; j < classInfo[i].size(); j++) {
    69. System.out.print(classInfo[i].get(j));
    70. if (j != classInfo[i].size() - 1) {
    71. System.out.print(" ");
    72. } else {
    73. System.out.println();
    74. }
    75. }
    76. }
    77. }
    78. }

    JavaScript代码

    1. const rl = require("readline").createInterface({ input: process.stdin });
    2. var iter = rl[Symbol.asyncIterator]();
    3. const readline = async () => (await iter.next()).value;
    4. void async function() {
    5. while (line = await readline()) {
    6. processClassCheck(line);
    7. }
    8. }();
    9. function processClassCheck(input) {
    10. var kidsInfoStr = input.split(" ");
    11. if (kidsInfoStr == null || kidsInfoStr.length == 0) {
    12. console.log("ERROR");
    13. return;
    14. }
    15. var classInfo = new Array(2);
    16. classInfo[0] = new Array();
    17. classInfo[1] = new Array();
    18. var curClass = 1;
    19. for (var i = 0; i < kidsInfoStr.length; i++) {
    20. var eachRecord = kidsInfoStr[i];
    21. var recordDetail = eachRecord.split("/");
    22. if (recordDetail == null || recordDetail.length != 2) {
    23. console.log("ERROR");
    24. return;
    25. }
    26. if (isNaN(recordDetail[0]) ) {
    27. console.log("ERROR");
    28. return;
    29. }
    30. var num = parseInt(recordDetail[0]);
    31. if ("Y" == recordDetail[1]) {
    32. classInfo[curClass].push(num);
    33. } else if ("N" == recordDetail[1]) {
    34. curClass ^= 1;
    35. classInfo[curClass].push(num);
    36. } else {
    37. console.log("ERROR");
    38. return;
    39. }
    40. }
    41. var sortFun = function(a,b)
    42. {
    43. return a - b;
    44. }
    45. classInfo[0].sort( sortFun );
    46. classInfo[1].sort( sortFun );
    47. if (classInfo[1].length > 0 && classInfo[1][0] < classInfo[0][0]) {
    48. var tmp = classInfo[0];
    49. classInfo[0] = classInfo[1];
    50. classInfo[1] = tmp;
    51. }
    52. for (var i = 0; i < classInfo.length; i++) {
    53. if (classInfo[i].length == 0) {
    54. // 如果为 0,一定是第二个
    55. console.log("");
    56. break;
    57. }
    58. var output = "";
    59. for (var j = 0; j < classInfo[i].length; j++) {
    60. output += classInfo[i][j] ;
    61. if (j != classInfo[i].length - 1) {
    62. output += " ";
    63. }
    64. }
    65. console.log( output );
    66. }
    67. }

    (完)

  • 相关阅读:
    Android 学习 鸿蒙HarmonyOS 4.0 第一天
    S7-200SMART PLC Modbus TCP通信(多服务器多从站轮询)
    探讨Socks5代理技术的原理及其在不同领域的应用
    如何控制方法的调用Timeout超时,并主动中断调用请求
    【深度学习】Mini-Batch梯度下降法
    log4j日志打印导致OOM问题
    【国标语音对讲】EasyCVR视频汇聚平台海康/大华/宇视摄像头GB28181语音对讲配置
    用微信小程序开启桶装水订购业务
    性能、成本与 POSIX 兼容性比较: JuiceFS vs EFS vs FSx for Lustre
    上传ipa到appstore最简单的方法
  • 原文地址:https://blog.csdn.net/ZiJinShi/article/details/133323780