華為OD機試題庫《C++》限時優惠 9.9
華為OD機試題庫《Python》限時優惠 9.9
華為OD機試題庫《JavaScript》限時優惠 9.9
針對刷題難,效率慢,我們提供一對一算法輔導, 針對個人情況定制化的提高計劃(全稱1V1效率更高)。
看不懂有疑問需要答疑輔導歡迎私VX: code5bug
題目描述
幼兒園兩個班的小朋友在排隊時混在了一起,每位小朋友都知道自己是否與前面一位小朋友是否同班,請你幫忙把同班的小朋友找出來。
小朋友的編號為整數,與前一位小朋友同班用Y表示,不同班用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
題解
該題目屬于構造算法,也可以歸類為字符串處理和數組操作類型的題目。通過對輸入進行解析并根據條件將小朋友分班,需要保持結果的升序排列,同時處理異常輸入。
解題思路
數據解析:輸入是以空格分開的小朋友編號和是否同班標志。解析時要把小朋友編號與是否同班的標志分離開。
分班:從第一個小朋友開始,使用兩個列表分別存放兩個班的小朋友。根據標志 Y 或 N 判斷當前小朋友應該分到哪個班:
如果標志是
Y
,那么當前小朋友與前一個小朋友同班。如果標志是
N
,則當前小朋友與前一個小朋友不同班。
- 排序與輸出:對于每個班的小朋友的編號,按照升序排列。并根據題目要求輸出結果:
- 若兩個班的小朋友編號都不為空,按照第一個編號較小的班級先輸出。
若只有一個班的小朋友,則第二行輸出空行。
- 異常處理:如果小朋友編號不在范圍內,直接輸出
ERROR
。
JavaScript
const rl = require('readline').createInterface({input: process.stdin,output: process.stdout,
});var iter = rl[Symbol.asyncIterator]();const readline = async () => (await iter.next()).value;// Author: code5bug
(async () => {const input = (await readline()).split(' ').map((p) => {let [num, flag] = p.split('/');return [parseInt(num), flag];});// cls[2] 數組用于表示兩個班級const cls = Array(2).fill().map(() => []);// 前一個同學所在的班級,輸入是否不合法let pre = 0,err = false;input.forEach(([num, flag]) => {let idx = flag === 'Y' ? pre : pre ^ 1;cls[idx].push(num);// 輸入不合法if (num <= 0 || num > 999) err = true;pre = idx;});if (err) {console.log('ERROR');} else {// 對每個班級的學生編號升序排序cls.forEach((arr) => arr.sort());let r1 = cls[0].join(' ');let r2 = cls[1].join(' ');// 編號需要按照大小升序排列,分班記錄中第一個編號小的排在第一行if (r1.localeCompare(r2) > 0) {[r1, r2] = [r2, r1];}// 打印結果console.log(r1);console.log(r2);}rl.close();
})();
整理題解不易, 如果有幫助到您,請給點個贊 ???? 和收藏 ?,讓更多的人看到。🙏🙏🙏