幼儿园两个班的小朋友在排队时混在了一起,每位小朋友都知道自己是否与前面一位小朋友是否同班,请你帮忙把同班的小朋友找出来。
小朋友的编号为整数,与前一位小朋友同班用Y表示,不同班用N表示。
输入为空格分开的小朋友编号和是否同班标志。
比如:6/N 2/Y 3/N 4/Y,表示共4位小朋友,2和6同班,3和2不同班,4和3同班。
其中,小朋友总数不超过999,每个小朋友编号大于0,小于等于999。
不考虑输入格式错误问题。
输出为两行,每一行记录一个班小朋友的编号,编号用空格分开。且:
题目要求根据小朋友的编号和同班标志将小朋友分为两个班级,并按照编号升序输出每个班级的小朋友。
我们可以使用两个列表(list1和list2)来存储两个班级的小朋友编号,遍历输入的小朋友信息,根据同班标志将小朋友添加到对应的列表中。然后对两个列表进行排序,并按照要求输出两个班级的小朋友编号。
具体步骤如下:
该算法通过遍历小朋友信息,根据同班标志将小朋友编号添加到对应的班级列表中,然后对两个列表进行排序,并按照要求输出两个班级的小朋友编号。算法的时间复杂度主要取决于排序的时间复杂度,为O(NlogN),其中N为小朋友的数量。
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在线答疑。