左右からの積で自分以外の積を並べる

整数の​並びの​各位置に​ついて、​その​位置を​除いた​全部の​数の​積を​並べて​返します。​割り算を​使わず、​左からの​積と​右からの​積を​ 2 回なめて​掛け合わせる​練習です。

海外で定番の問題リスト 4 本のうち 4 本に入っています (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150)

問題

整数の並び nums を受け取ります。同じ長さの並び out を作り、out の i 番目には「nums の i 番目を除いた、残り全部の数の積」を入れて返す関数を書いてください。

  • 割り算を使わずに解いてください
  • 時間は O(n) で解いてください。n は nums の長さです
  • nums の長さは 2 以上 100000 以下、値はどれも -30 以上 30 以下です
  • 途中のどの積も、32 ビットの符号付き整数に収まるものとします

入力と出力の例

例 1

入力

nums = [2, 3, 5, 1]

出力

[15, 10, 6, 30]

例 2

0 が 1 つあると、0 の位置以外はどれも 0 になります。

入力

nums = [4, 0, 2, -1]

出力

[0, -8, 0, 0]

例 3

負の数も入ります。

入力

nums = [-2, -3, 4]

出力

[-12, -8, 6]

面接での聞かれ方

面接では、まず条件なしで聞かれ、あとから条件が足されることがよくあります。

  • 「各要素について、自分以外の要素の積を並べた配列を返してください」
  • 全部の積を出して各値で割る書き方を見せると、「割り算を使わずに書けますか?」と続きます
  • 「0 が入っていたら、割り算の書き方はどうなりますか?」と、割り算の弱点を聞かれます
  • 書き終えたあとに「返す配列のほかに、追加の記憶を O(1) にできますか?」と詰められることもあります

割り算の書き方は 0 があると崩れるので、割り算を禁じる条件には、0 の扱いを避けさせない意味があります。

アルゴリズムのチートシートの「ハッシュマップ」に、​この​型の​要点を​表と​コードで​まとめています。

main.py
def product_except_self(nums):
    # ここに書きます
    pass


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

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