一、题目描述
幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。
小朋友的编号为整数,与前一位小朋友同班用Y表示,不同班用N表示。
二、输入描述
输入为空格分开的小朋友编号和是否同班标志。
比如:6/N 2/Y 3/N 4/Y,表示共4位小朋友,2和6同班,3和2不同班,4和3同班。
其中,小朋友总数不超过999,每个小朋友编号大于0,小于等于999。
不考虑输入格式错误问题。
三、输出描述
输出为两行,每一行记录一个班小朋友的编号,编号用空格分开。且:
- 编号需要按照大小升序排列,分班记录中第一个编号小的排在第一行;
- 若只有一个班的小朋友,第二行为空行;
- 若输入不符合要求,则直接输出字符串ERROR。
四、解题思路
题目要求根据小朋友的编号和同班标志将小朋友分为两个班级,并按照编号升序输出每个班级的小朋友。
我们可以使用两个列表(list1和list2)来存储两个班级的小朋友编号,遍历输入的小朋友信息,根据同班标志将小朋友添加到对应的列表中。然后对两个列表进行排序,并按照要求输出两个班级的小朋友编号。
具体步骤如下:
- 读取输入的小朋友信息,使用split方法分割字符串得到小朋友编号和同班标志;
- 创建两个空列表list1和list2,用于存储两个班级的小朋友编号;
- 初始化变量pre为1,表示前一个小朋友的同班标志,默认为1;
- 遍历小朋友信息:
- 如果是第一个小朋友,将其编号添加到list1中,同时更新pre为1。
- 如果pre为1,根据同班标志判断将小朋友编号添加到list1或list2中,更新pre为对应的班级标志。
- 如果pre为2,根据同班标志判断将小朋友编号添加到list2或list1中,更新pre为对应的班级标志。
- 对list1和list2进行升序排序;
- 输出list1的内容,每个编号之间用空格分隔,并换行;
- 输出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在线答疑。