スライディングウィンドウで続いた 1 の最長を数える

0 と​ 1 だけの​並びから、​1 が​いちばん長く​続いた​所の​長さを​返します。​並びを​ 1 回なめながら、​いま続いている​長さと​最長を​覚えておく​練習です。

海外で定番の問題リスト 4 本には入っていません

問題

毎日の記録を、学習した日は 1、しなかった日は 0 として並べた days を受け取ります。1 がいちばん長く続いた所の長さ (続けて学習できた最長の日数) を返す関数を書いてください。

  • days の値は 0 か 1 だけです
  • 1 が 1 つも無いときは 0 を返します
  • days の長さは 1 以上 100000 以下です

入力と出力の例

例 1

1 は 2 日、3 日、1 日と続いています。いちばん長いのは真ん中の 3 日です。

入力

days = [1, 1, 0, 1, 1, 1, 0, 1]

出力

3

例 2

1 が 1 つもありません。

入力

days = [0, 0, 0]

出力

0

例 3

いちばん長い続きが、並びの最後で終わります。

入力

days = [0, 1, 1, 1, 1]

出力

4

面接での聞かれ方

面接では、短く次のように渡されることが多いです。

  • 「0 と 1 の配列で、1 が連続する最大の長さを返してください」
  • 書き終えたあとに「0 を 1 回だけ 1 に変えてよいなら、最長はいくつになりますか?」と続きを聞かれます。ここで、左右の端を持つ窓の考え方につながります
  • 「並びが流れてくる (最後まで一度に持てない) としたら、どう書きますか?」と、記憶の使い方を聞かれることもあります

ジュニアの問題なので、1 回なめて答えを出せることと、最後で終わる続きを取りこぼさないことが見られます。

アルゴリズムのチートシートの「配列と文字列」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def max_consecutive_ones(days):
    # ここに書きます
    pass


# 「実行」を押すと、この行の結果が出ます
print(max_consecutive_ones([1, 1, 0, 1, 1, 1, 0, 1]))

できているか「例で確かめる」を押すと、問題の例を全部この関数に渡して、通ったかをここに出します