华为OD机试真题B卷 JavaScript 实现【分班】,附详细解题思路

在这里插入图片描述

一、题目描述

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

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

二、输入描述

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

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

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

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

三、输出描述

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

  1. 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行;
  2. 若只有一个班的小朋友,第二行为空行;
  3. 若输入不符合要求,则直接输出字符串ERROR。

四、解题思路

题目要求根据小朋友的编号和同班标志将小朋友分为两个班级,并按照编号升序输出每个班级的小朋友。

我们可以使用两个列表(list1和list2)来存储两个班级的小朋友编号,遍历输入的小朋友信息,根据同班标志将小朋友添加到对应的列表中。然后对两个列表进行排序,并按照要求输出两个班级的小朋友编号。

具体步骤如下:

  1. 读取输入的小朋友信息,使用split方法分割字符串得到小朋友编号和同班标志;
  2. 创建两个空列表list1和list2,用于存储两个班级的小朋友编号;
  3. 初始化变量pre为1,表示前一个小朋友的同班标志,默认为1;
  4. 遍历小朋友信息:
    • 如果是第一个小朋友,将其编号添加到list1中,同时更新pre为1。
    • 如果pre为1,根据同班标志判断将小朋友编号添加到list1或list2中,更新pre为对应的班级标志。
    • 如果pre为2,根据同班标志判断将小朋友编号添加到list2或list1中,更新pre为对应的班级标志。
  5. 对list1和list2进行升序排序;
  6. 输出list1的内容,每个编号之间用空格分隔,并换行;
  7. 输出list2的内容,每个编号之间用空格分隔。

该算法通过遍历小朋友信息,根据同班标志将小朋友编号添加到对应的班级列表中,然后对两个列表进行排序,并按照要求输出两个班级的小朋友编号。算法的时间复杂度主要取决于排序的时间复杂度,为O(NlogN),其中N为小朋友的数量。

五、JavaScript算法源码

function findClassmates() {
    const readline = require('readline');

    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout
    });

    rl.question('请输入小朋友编号和同班标志(空格分隔):', (input) => {
        const arr = input.split(' ');

        // 存储两个班级的小朋友编号
        const list1 = [];
        const list2 = [];

        // 前一个小朋友的同班标志
        let pre = 1;
        for (let i = 0; i < arr.length; i++) {
            const [num, flag] = arr[i].split('/');
            // 如果是第一个小朋友,将其编号添加到list1中,同时更新pre为1
            if (i === 0) {
                list1.push(parseInt(num));
                pre = 1;
                continue;
            }

            // 如果pre为1,根据同班标志判断将小朋友编号添加到list1或list2中,更新pre为对应的班级标志
            if (pre === 1) {
                if (flag === 'Y') {
                    list1.push(parseInt(num));
                } else {
                    list2.push(parseInt(num));
                    pre = 2;
                }
            } else {// 如果pre为2,根据同班标志判断将小朋友编号添加到list2或list1中,更新pre为对应的班级标志
                if (flag === 'Y') {
                    list2.push(parseInt(num));
                } else {
                    list1.push(parseInt(num));
                    pre = 1;
                }
            }
        }

        // 对list1和list2进行升序排序
        list1.sort((a, b) => a - b);
        list2.sort((a, b) => a - b);

        console.log(list1.join(' '));
        console.log(list2.join(' '));

        rl.close();
    });
}

findClassmates();

六、效果展示

在这里插入图片描述


下一篇:华为OD机试真题 JavaScript 实现【相对开音节】【2022Q4 100分】,附详细解题思路

本文收录于,华为OD机试(JavaScript)真题(A卷+B卷)

每一题都有详细的答题思路、详细的代码注释、样例测试,订阅后,专栏内的文章都可看,可加入华为OD刷题群(私信即可),发现新题目,随时更新,全天CSDN在线答疑。

在这里插入图片描述

你可能感兴趣的:(搬砖工逆袭Java架构师,华为od,javascript,算法,前端,vue.js)