LeetCodeを解いてみた
LeetCodeに挑んだ理由
きっかけは単純なJavaScriptの文法をド忘れしてしまったことです。
Webアプリの開発を行っているとデータフローや処理ばかりであまり文法的なことを書くことが少なかったからかもしれません。
かなりの衝撃を受けてもう一度文法とかアルゴリズムを学習しようと思いました。。。
問題
30 Days of JavaScriptという問題(集?)を進めていて、今回は「Debounce」と言う問題を紹介します。
どんな問題か
ざっくりと要約すると、
- 関数を返却する関数を定義する
- 引数は(fn: 実行する関数, t: m秒)
- 返却された関数は以下の機能を持つ
- t秒後にfnを実行する
- もしfnの実行前に再度呼ばれた場合はカウントをリセットして再カウントする
という問題です。
詳しくはLeetCodeをご覧ください。
タイマーをした実行したい関数が呼ばれる前に実行をタイマーする関数を実行するとカウントをリセットするような処理です。
言葉で書いているとこんがらがりそうです。
作成したコード
type F = (...args: number[]) => void
function debounce(fn: F, t: number): F {
let timerId;
return function(...args) {
clearTimeout(timerId);
timerId = setTimeout(() => fn(...args), t);
}
};
方針
非同期処理の例の中でよく見るsetTimeoutは戻り値としてタイマーのIDを返却してくれます。
これをclearTimeoutでクリアしてあげればいいので関数が呼ばれた時にまずはクリアできるようにしています。
まとめ
今回の問題は割とときやすかったですがこの問題の少し前の問題などは結構混乱しました。
まだまだだなと痛感しながらちまちまと問題を解いて行っています。
少しQiitaへの投稿も慣れてきたらもう少し難しい問題なども投稿していきたいです。
コメントなど是非是非よろしくお願いします!