免責事項: 問題と考えられる解決策を理解することはあなたの関心事であるため、コードを追加するのではなく、いくつかの考えだけを追加します。後でそれについて考えて、独自のコードを実行することができます (そしてすべきです)。
1 つの詳細が、データの保存方法に違いをもたらす可能性があります。「分」の粒度はどのくらいですか? たった 1 分ですか、60 秒ですか、それとも 60,000 ミリ秒ですか? たとえば、現在のタイムスタンプが 03:44:30,820 であるとします。03:39:31,820 に受信したリクエストは「最後の 5 分」以内に発生したか? 「分」の粒度が 1 分の場合、そうではありません (03:44、03:43、03:42、03:41、および 03:40 のリクエストのみ)。「分」の粒度が 60 秒の場合、それは過去 5 分以内に発生します。
したがって、「分」の粒度が 1 分であると仮定します (簡単にするため)。このように、「キュー」の長さはわずか 5 桁です。各位置には、その 1 分間に発生したリクエストの数を含めることができます。あなたの問題#2は終わりました。また、キューの代わりにリンクされたリストがある場合は、head
とtail
ポインターを維持できるため、問題 #1 も解消されます。
可能な最適化 (数分間リクエストがない場合にコードを少し複雑にする可能性がありますが、とにかく調査する価値があります) は次のとおりです。リストのサイズは固定されているため (この場合は 5)、循環を使用することもできます。ポインタのペアを取り除き、last
ポインタだけを保持します。
これらはアイデアの一部にすぎませんが、インタビュアーの意図はおそらく、問題について考えさせ、質問をさせ、アイデアを投げ出させ、そこからコードを導き出すことでした。