7-22 ボスのスケジュール
原題:
誰かが新浪微博に上司のスケジュールを投稿したところ、彼は毎日4時半に起きていることがわかりました。しかしすぐに、鋭い目を持つネットユーザーたちが「この時刻表は不完全です。朝の9時から午後1時まで何をしていますか?」と尋ねました。
この問題では、時刻表をチェックし、時刻表に書かれていない期間を見つけるプログラムを作成するよう求められます。
入力形式:
入力の最初の行では、スケジュールにリストされている期間の数である正の整数Nを指定します。次にN行があり、各行に期間が示されます。形式は次のとおりです。
hh:mm:ss - hh:mm:ss
このうちhh
、mm
、 、ss
はそれぞれ 2 桁の時、分、秒です。1 回目は開始時間、2 回目は終了時間です。この質問では、すべての時間が 1 日以内 (つまり、00:00:00 から 23:59:59) であること、各間隔の間隔が少なくとも 1 秒であること、および指定された 2 つの時間間隔が重複するエンドポイントが最大 1 つであることを確認します。 . 区間の重複はありません。
出力フォーマット:
timetable に表示されない間隔を時系列順にリストします。各間隔は 1 行を占め、入力と同じ形式で表示されます。この質問により、出力する必要のある間隔が少なくとも 1 つあることが確認されます。
。
問題解決のアイデア:
- モジュールをインポートし
readline
てインターフェイス オブジェクトを作成します。まずreadline
モジュールを導入し、createInterface
メソッドを使用してインターフェイス オブジェクトを作成しますrl
。このオブジェクトは、入力ストリームを標準入力に設定します。 - 入力を読み取り、保存する:
'line'
イベントをリッスンすることにより、入力は配列に保存されますbuf
。 - 入力を解析して並べ替える:
slice
メソッドを使用して、インデックス 1 から始まる入力配列をインターセプトし、最初の要素を削除して、それを変数に割り当てますtimes
。次に、期間の順序で処理する必要があるためsort
、このメソッドを使用しtimes
て配列を昇順に並べ替えます。 - 変数の初期化: 初期変数を処理の開始時点を示す
start
string に設定し、初期変数を出力期間の格納に使用される空の文字列に設定します。'00:00:00'
res
- 各期間を処理する: ループを使用して配列
for of
を走査し、各期間を変数に割り当てます。期間を 2 つの時間に分割し、それぞれを変数とに割り当てるメソッドを使用します。それが大きい場合は、欠落している期間があることを意味し、欠落している期間が結果に追加されます。現在の期間の終了時刻に更新されます。times
i
split
begin
end
begin
start
res
start
end
- 最後の期間を処理する: 最後の期間の終了時刻が
end
より小さい場合23:59:59
、最後に未処理の期間があることを意味し、それが結果に追加されますres
。 - 出力結果:
console.log
先頭と末尾のスペースを削除した結果文字列を出力するために使用します。
。
JavaScript (ノード) コード:
const readline = require('readline');
const rl = readline.createInterface({
input: process.stdin,
});
let buf = []
rl.on('line', (line) => {
buf.push(line)
})
rl.on('close', () => {
let times = buf.slice(1).sort()
let start = '00:00:00'
let res = ''
for (let i of times) {
let [begin, end] = i.split(' - ')
if (begin > start) {
res += `${
start} - ${
begin}\n`
}
start = end
}
if (start < '23:59:59') {
res += `${
start} - 23:59:59`
}
console.log(res.trim())
});
。