JavaScript
 Computer >> コンピューター >  >> プログラミング >> JavaScript

JavaScriptで配列内の時刻の最小時間差を求める方法

問題概要

JavaScriptで、24時間制の時刻を「時:分」形式で表した文字列の配列を受け取る関数を作成します。この関数の目的は、配列内の任意の2つの時刻の組み合わせの中から、最も小さい時間差(分単位)を見つけ出すことです。

例えば、次のような入力が与えられたとします。

const arr = ["23:59","00:00"];

この場合、期待される出力は以下の通りです。

const output = 1;

これは、「23:59」と翌日の「00:00」の間の時間差がわずか1分であるためです。時刻は一日の中で循環することを考慮する必要がある点に注意してください。

解決のアプローチ

この問題を効率的に解くためには、以下の手順で処理を行います。

  1. 各時刻文字列を「時」と「分」に分解し、すべて「午前0時からの経過分数」に変換します。
  2. 日をまたぐケース(例:23:59 → 00:00)に対応するため、各時刻に24時間(1440分)を加算した値も併せて記録します。
  3. 同一の時刻が重複して存在する場合は、最小差は0となるため即座に0を返します。
  4. ソート済みの状態で隣接する時刻同士の差を計算し、その最小値を求めます。

実装コード

以下が実際のコード例です。

const arr = ["23:59","00:00"];

const findMinDifference = (arr = []) => {
    // 時刻文字列を分単位の数値に変換するヘルパー関数
    const find = (str = '') => str.split(':').map(time => parseInt(time, 10))

    // 各時刻を午前0時からの経過分数に変換
    const mapped = arr.map((time) => {
        const [hour1, minute1] = find(time)
        return hour1 * 60 + minute1
    });

    const sorted = []
    let isrepeating = false

    // 日をまたぐ差分にも対応できるよう、+24時間の値も登録
    mapped.forEach((time) => {
        if (sorted[time] !== undefined || sorted[time + 24 * 60] !== undefined) {
            isrepeating = true
       }
       sorted[time] = time
       sorted[time + 24 * 60] = time + 24 * 60
    })

    // 同じ時刻が存在すれば最小差は0
    if (isrepeating) {
        return 0
    }

    let min = Infinity
    let prev = null

    // 隣接する時刻間の差を比較して最小値を更新
    for (let i = 0; i < sorted.length; i++) {
        if (sorted[i] !== undefined) {
            if (prev) {
                min = Math.min(min, sorted[i] - prev)
            }
            prev = sorted[i]
        }
    }
    return min
};

console.log(findMinDifference(arr));

実行結果

上記のコードを実行すると、コンソールには以下の出力が表示されます。

1

コードのポイント解説

  • 時刻の数値化: 「23:59」のような文字列をsplit(':')で分割し、parseIntで数値化した後、「時 × 60 + 分」の計算式で総分数に変換しています。
  • 日跨ぎへの対応: 配列sortedに対して、元の時刻と「+1440分(24時間)」した時刻の両方を登録することで、深夜0時をまたぐ時間差も正しく計算できます。
  • 重複チェック: 同じ時刻が2回以上現れた場合、時間差は必然的に0分になるため、早期リターンで処理を終えています。
  • 最小値の探索: インデックス順に走査することで実質的なソート効果が得られ、隣接要素間の差分を比較しながら最小値を更新していきます。

このアルゴリズムにより、24時間制の時刻データから効率的に最小の時間差を求めることができます。

  1. 【JavaScript】配列の中で左右の合計が等しくなる中央インデックス(ピボットインデックス)を見つける方法

    問題数値の配列 arr が与えられたとき、「あるインデックスより左側にあるすべての要素の合計」と「そのインデックスより右側にあるすべての要素の合計」が等しくなる位置(中央インデックス/ピボットインデックス)を求める JavaScript 関数を作成します。該当するインデックスが複数存在する場合は、最初に見つかったものを返し、存在しない場合は -1 を返すのが一般的です。たとえば、次のような入力を考えます。入力const arr = [1, 7, 3, 6, 5, 6];出力const output = 3;出力の解説インデックス 3 の要素は nums[3] = 6 です。この要素の左側にある

  2. C++で時刻リストの最小時間差を求めるアルゴリズムと実装

    24時間制の時刻を「時:分」形式の文字列で表したリストが与えられます。このリストの中から、任意の2つの時刻の組み合わせについて分単位の差を計算し、その最小値を求めるのが本記事のテーマです。例えば、入力が [12:30, 15:17] の場合、2つの時刻の差は167分となるため、出力は 167 になります。 ポイント:時刻は循環構造を持つ この問題で注意すべき点は、時計の時刻が循環していることです。例えば「23:50」と「00:10」の差は、単純な引き算では1430分になりますが、実際には真夜中をまたいで20分しか離れていません。したがって、日付をまたぐケースも必ず考慮する必要があります。 解法