Pintia の問題解決——7-22 ボスのスケジュール

7-22 ボスのスケジュール

原題:

誰かが新浪微博に上司のスケジュールを投稿したところ、彼は毎日4時半に起きていることがわかりました。しかしすぐに、鋭い目を持つネットユーザーたちが「この時刻表は不完全です。朝の9時から午後1時まで何をしていますか?」と尋ねました。

この問題では、時刻表をチェックし、時刻表に書かれていない期間を見つけるプログラムを作成するよう求められます。

入力形式:

入力の最初の行では、スケジュールにリストされている期間の数である正の整数Nを指定します。次にN行があり、各行に期間が示されます。形式は次のとおりです。

hh:mm:ss - hh:mm:ss

このうちhhmm、 、ssはそれぞれ 2 桁の時、分、秒です。1 回目は開始時間、2 回目は終了時間です。この質問では、すべての時間が 1 日以内 (つまり、00:00:00 から 23:59:59) であること、各間隔の間隔が少なくとも 1 秒であること、および指定された 2 つの時間間隔が重複するエンドポイントが最大 1 つであることを確認します。 . 区間の重複はありません。

出力フォーマット:

timetable に表示されない間隔を時系列順にリストします。各間隔は 1 行を占め、入力と同じ形式で表示されます。この質問により、出力する必要のある間隔が少なくとも 1 つあることが確認されます。

問題解決のアイデア:

  1. モジュールをインポートしreadlineてインターフェイス オブジェクトを作成します。まずreadlineモジュールを導入し、createInterfaceメソッドを使用してインターフェイス オブジェクトを作成しますrlこのオブジェクトは、入力ストリームを標準入力に設定します。
  2. 入力を読み取り、保存する:'line'イベントをリッスンすることにより、入力は配列に保存されますbuf
  3. 入力を解析して並べ替える:sliceメソッドを使用して、インデックス 1 から始まる入力配列をインターセプトし、最初の要素を削除して、それを変数に割り当てますtimes次に、期間の順序で処理する必要があるためsort、このメソッドを使用しtimesて配列を昇順に並べ替えます。
  4. 変数の初期化: 初期変数を処理の開始時点を示すstartstring に設定し、初期変数を出力期間の格納に使用される空の文字列に設定します。'00:00:00'res
  5. 各期間を処理する: ループを使用して配列for ofを走査し、各期間を変数に割り当てます期間を 2 つの時間に分割し、それぞれを変数とに割り当てるメソッドを使用しますそれが大きい場合は、欠落している期間があることを意味し、欠落している期間が結果に追加されます現在の期間の終了時刻に更新されますtimesisplitbeginendbeginstartresstartend
  6. 最後の期間を処理する: 最後の期間の終了時刻がendより小さい場合23:59:59、最後に未処理の期間があることを意味し、それが結果に追加されますres
  7. 出力結果: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())
});

複雑さの分析:

時間計算量: O(nlogn)
空間複雑さ: O(n+m)

おすすめ

転載: blog.csdn.net/Mredust/article/details/133519759