はじめに
私は思考トレーニングの一環として、LeetCodeを解く過程における思考の軌跡をアウトプットしています。
今回は、JavaScriptを使って「2725. Interval Cancellation」の問題を解いた軌跡を記録していきます。
問題URL:
https://leetcode.com/problems/interval-cancellation/description/
問題の概要
この問題を一言で言うと
一定時間ごとに関数を実行し続けて、指定された時間になったら処理を止める問題
分からなかったことを仮説・調査を通して整理する
①setIntervalとclearIntervalの違い
仮説:名前の通り、setIntervalが処理のインターバル(間隔)を設定し、clearIntervalがインターバルの最終的な間隔をClear(はっきり)する違いを持つと考えました
調査結果:
それぞれ、
- setInterval:一定時間ごとに処理を繰り返して
- clearInterval:処理の繰り返しをやめて
という意味
- 個人的な意見として、clearIntervalよりもstopIntervalの方が適していると感じました
- ですが、調べてみると
stopは一時停止(再開できるニュアンス)で、clearはクリア(無効化・消去)する意味合いなので、今回の場合はこちらの方が適していることが分かりました
最終的な実装
実際の回答コード
/**
* @param {Function} fn
* @param {Array} args
* @param {number} t
* @return {Function}
*/
var cancellable = function(fn, args, t) {
console.log('args', args)
console.log('t', t)
console.log('fn', fn)
// 時刻0で関数を即座に実行
fn(...args);
// 繰り返し実行間隔を設定
const intervalId = setInterval(() => {
fn(...args);
}, t);
// インターバルをキャンセルするクロージャ関数を返す
return function cancelFn() {
clearInterval(intervalId);
};
};
振り返り
- 今回の問題は全体的にピンとこなかったです
- 初見でこの問題を見た時は、非同期処理をイメージしたが、非同期処理は重い処理などが実行されている間に別の処理を実行するといった感じなので、厳密に言えば違うまではなんとか分かりました
- 非同期処理自体も当初は「処理の合間に別の処理を実行する?だから何???」といった感じだったので、この系統の問題には困惑してしまう傾向にあるのかも知れない