プログラマーさっきの歌(level 3)


私の第1ラウンド

function solution(m, musicinfos) {
    var answer = '';
    const arrM = m.split(/(\w\#*)/).filter(x => x.length!==0);
    let max = 0;
    for (let x of musicinfos) {
        let [start, end, title, info] = x.split(",");
        let end_minute = +end.slice(3);
        let start_minute = +start.slice(3);
        let end_hour = +end.slice(0,2);
        let start_hour = +start.slice(0,2);
        let infoCount = 0;
        
        if (+end.slice(3) >= +start.slice(3)) {
            time = 60 * (end_hour - start_hour) + (end_minute - start_minute);
        } else {
            time = 60 * (end_hour - start_hour - 1) + (60 + end_minute - start_minute);
        }
        const arrInfo = info.split(/(\w\#*)/).filter(x => x.length!==0);
        let count = 0;
        for (let i = 0; i < time; i++) {
            if (arrInfo[i % arrInfo.length] === arrM[count % arrM.length]) {
                count++;
            } else {
                infoCount = Math.max(infoCount, count);
                count = 0;
            }
        }
        infoCount = Math.max(infoCount, count);
        
        if (infoCount > max) {
            max = infoCount
            answer = title;
        }
    }
    return answer;
}
musicinfosを巡回し,構造分解配分として必要な情報を得る.そして、infoに戻ると、パターンが一番多い曲のタイトルを返します.
30のテストケースのうち7つが失敗しました.間違いの原因を探す.

私の2回目の答え

function solution(m, musicinfos) {
    var answer = '';
    const arrM = m.split(/(\w\#*)/).filter(x => x.length!==0);
    let max = 0;
    let arr = [];
    for (let x of musicinfos) {
        let [start, end, title, info] = x.split(",");
        let end_minute = +end.slice(3);
        let start_minute = +start.slice(3);
        let end_hour = +end.slice(0,2);
        let start_hour = +start.slice(0,2);
        let infoCount = 0;
        
        if (end_minute >= start_minute) {
            time = 60 * (end_hour - start_hour) + (end_minute - start_minute);
        } else {
            time = 60 * (end_hour - start_hour - 1) + (60 + end_minute - start_minute);
        }
        const arrInfo = info.split(/(\w\#*)/).filter(x => x.length!==0);
        let count = 0;
        for (let i = 0; i < time; i++) {
            if (arrInfo[i % arrInfo.length] === arrM[count % arrM.length]) {
                count++;
                if (count === arrM.length) {
                    arr.push([time, title]);
                    break;
                }
            } else {
                count = 0;
            }
        }
    }
    let timeMax = Math.max(arr.map(x=>x[0]));
    arr = arr.filter(x => x[0] === timeMax);
    return arr.length === 0 ? "(None)" : arr[0][1];
}
ルールは間違っていて、ずっとシャベルをしています.
パターンが1回完全に現れる限り、歌曲候補リストに入り、放送中に実行される長さに基づいて最終候補リストを判断することができる.この方法で2つのテストケースを解決したが,まだ5つも解決していない.

私の3回目の答え

function solution(m, musicinfos) {
    var answer = '';
    const arrM = m.split(/(\w\#*)/).filter(x => x.length!==0);
    let max = 0;
    let arr = [];
    for (let x of musicinfos) {
        let [start, end, title, info] = x.split(",");
        let end_minute = +end.slice(3);
        let start_minute = +start.slice(3);
        let end_hour = +end.slice(0,2);
        let start_hour = +start.slice(0,2);
        let infoCount = 0;
        
        if (end_minute >= start_minute) {
            time = 60 * (end_hour - start_hour) + (end_minute - start_minute);
        } else {
            time = 60 * (end_hour - start_hour - 1) + (60 + end_minute - start_minute);
        }
        const arrInfo = info.split(/(\w\#*)/).filter(x => x.length!==0);
        let count = 0;
        for (let i = 0; i < time; i++) {
            if (arrInfo[i % arrInfo.length] === arrM[count % arrM.length]) {
                count++;
                if (count === arrM.length) {
                    arr.push([time, title]);
                    break;
                }
            } else {
                count = 0;
                if (arrInfo[i % arrInfo.length] === arrM[count % arrM.length]) {
                    count++;
                }
            }
        }
    }
    let timeMax = Math.max(...arr.map(x=>+x[0]));
    arr = arr.filter(x => x[0] === timeMax);
    return arr.length === 0 ? "(None)" : arr[0][1];
}
わあ、虚脱ですね.
Math.max()の使い方を使い間違えて、問題を解くことができませんでした.Math.max内に配列を入れるべきではなく,分散した配列を入れるべきであることを認識した.以前の解には最も長い楽譜があったので、解くことができます.
実際、私は問題を解くとき、約80%のテスト用例が解決され、私が逃した異常処理があるかどうかを考えていました.しかし,一つの方法の使い方を誤って理解しているため,アルゴリズム全体が間違っていても,多くのテストケースが正しい.使い方はもう少し慎重に.