
コーディング面接で
アルゴリズムのチートシートに、
日本の企業のコーディングテストの形と対策に、
標準入力から
この頁の目次3 項目
難度と出題の頻度の見方
出題の頻度は、海外でよく使われる定番の問題リスト 4 本 (Blind 75、NeetCode 150、Grind 75、LeetCode Top Interview 150) に何本入っているかで、よく出る・ときどき出る・少なめ の 3 段階に分けています。少なめは、
難度の目安
- 型を
1 つ 知っていれば 解ける 基本の 問い。 LeetCode の Easy ほど - 型を
選び、 端の 場合まで 詰めて 解く 問い。 LeetCode の Medium ほど - 型を
組み合わせるか、 計算量を 一段縮める 工夫が 要る 問い。 Medium の 難しい 物と Hard - いく
つもの 操作を 持つ仕組みを、 データの 持ち方から 設計して作る問い
準備の
最優先の 8 問先にここから
バックトラック
バックトラックで
並べ方を 全部作る 違う
数ばかりの 並びから、 全部の 数を 1 回ずつ 使った 並べ方を 残らず 作る。 1 つ 選んでは 先へ 進み、 戻る ときに 選んだ印を 外す、 バックトラックの 基本の 形です。 バックトラックで
足すと 目標に なる 組み合わせを 全部 集める 何度でも
使える 数の 並びから、 足すと 目標に なる 組み合わせを、 重ならないように 全部 返します。 選ぶ、 先へ 進む、 取り消す、 をくり返すバックトラックで、 選び始める 位置を 決めて 重なりを 防ぐ 練習です。 バックトラックで
正しく 閉じた 括弧の 並びを 全部作る n 組の
丸括弧で 作れる、 正しく 閉じた 並びを 全部、 辞書の 順で 作ります。 開き括弧は あと 何個置けるか、 閉じ括弧は 開いた 数を 越えないか、の 2 つの 決まりで 枝を 切りながら 1 文字ずつ伸ばす、 バックトラックの 練習です。 バックトラックで
電話の ボタンの 数字から 作れる 文字の 並びを 全部 集める 昔の
携帯電話の ボタンには、 数字ごとに 英字が いくつか 割り当てられています。 押した 数字の 並びから 作れる 英字の 並びを、 決まった 順で 全部 集める 練習です。 バックトラックで
同じ値を 含む 並びから 重ならない 部分集合を 全部 集める 同じ
値が 何度か 出てくる 整数の 並びから、 選び方の 違う 部分集合を、 同じ物を 2 回入れずに 全部 集めます。 並べ替えてから 「同じ段で 同じ値を 2 回選ばない」と 決めて 重なりを 防ぐ 練習です。 バックトラックで
1 つずつしか 使えない 数から 足すと 目標に なる 組を 全部 集める 同じ
値が 何度か 出てくる 数の 並びから、 それぞれの 数を 1 回までしか 使わずに、 足すと 目標に なる 組を 重なりなく 全部 集めます。 並べ替えて、 同じ段で 同じ値を 2 回選ばない 練習です。 バックトラックで
文字列を 回文だけに 区切る 方法を 全部 集める 文字列を、どの
部分も 前から 読んでも 後ろから 読んでも 同じ (回文) に なるように 区切る 方法を、 全部 集めます。 頭から 1 つ目の 部分の 長さを 決めては 残りを 同じように 区切る、を 繰り返す練習です。 バックトラックで
文字の 盤の 上を たどって 言葉が 作れるか 調べる 英字が
升目に 並んだ盤の 上で、 隣り合う マスを たどって 言葉を 作れるかを 調べます。 通った マスに 印を 付けて 進み、 行き止まりなら印を 外して 戻る 練習です。 バックトラックで
互いに 取り合わない n 個の クイーンの 置き方を 全部 集める n 行 n 列の
盤に、 縦・ 横・ 斜めの どれでも 取り合わないように n 個の クイーンを 置く 方法を 全部 集めます。 1 行に 1 個ずつ 置き、 使った 列と 2 本の 斜めを 集合で 覚えて、 置けない 所を O(1) で 飛ばす練習です。
- バックトラックで
並べ方を全部作る違う数ばかりの並びから、全部の数を 1 回ずつ使った並べ方を残らず作る。1 つ選んでは先へ進み、戻るときに選んだ印を外す、バックトラックの基本の形です。 - バックトラックで
足すと 目標に なる 組み合わせを 全部集める何度でも使える数の並びから、足すと目標になる組み合わせを、重ならないように全部返します。選ぶ、先へ進む、取り消す、をくり返すバックトラックで、選び始める位置を決めて重なりを防ぐ練習です。 - バックトラックで
正しく 閉じた 括弧の 並びを全部作るn 組の丸括弧で作れる、正しく閉じた並びを全部、辞書の順で作ります。開き括弧はあと何個置けるか、閉じ括弧は開いた数を越えないか、の 2 つの決まりで枝を切りながら 1 文字ずつ伸ばす、バックトラックの練習です。 - バックトラックで
電話の ボタンの 数字から 作れる 文字の 並びを 全部集める昔の携帯電話のボタンには、数字ごとに英字がいくつか割り当てられています。押した数字の並びから作れる英字の並びを、決まった順で全部集める練習です。 - バックトラックで
同じ値を 含む 並びから 重ならない 部分集合を 全部集める同じ値が何度か出てくる整数の並びから、選び方の違う部分集合を、同じ物を 2 回入れずに全部集めます。並べ替えてから「同じ段で同じ値を 2 回選ばない」と決めて重なりを防ぐ練習です。 - バックトラックで
1 つずつしか 使えない 数から 足すと 目標に なる組を 全部集める同じ値が何度か出てくる数の並びから、それぞれの数を 1 回までしか使わずに、足すと目標になる組を重なりなく全部集めます。並べ替えて、同じ段で同じ値を 2 回選ばない練習です。 - バックトラックで
文字列を 回文だけに 区切る 方法を 全部集める文字列を、どの部分も前から読んでも後ろから読んでも同じ (回文) になるように区切る方法を、全部集めます。頭から 1 つ目の部分の長さを決めては残りを同じように区切る、を繰り返す練習です。 - バックトラックで
文字の 盤の 上を たどって 言葉が 作れるか調べる英字が升目に並んだ盤の上で、隣り合うマスをたどって言葉を作れるかを調べます。通ったマスに印を付けて進み、行き止まりなら印を外して戻る練習です。 - バックトラックで
互いに 取り合わない n 個の クイーンの 置き方を 全部集めるn 行 n 列の盤に、縦・横・斜めのどれでも取り合わないように n 個のクイーンを置く方法を全部集めます。1 行に 1 個ずつ置き、使った列と 2 本の斜めを集合で覚えて、置けない所を O(1) で飛ばす練習です。
海外の
そろった問題 149 / 150 問。準備中の
配列とハッシュ9 / 9 問
ツーポインタ5 / 5 問
スライディングウィンドウ6 / 6 問
スタック7 / 7 問
二分探索7 / 7 問
連結リスト11 / 11 問
- 35連結リストの
つなぎ先を 付け替えて 逆順にする - 36ダミーの
節で 2 本の 並んだ 連結リストを 1 本にまとめる - 37半分に
分けて 後ろを 逆にし、 連結リストを 前と 後ろから 互い 違いに並べ直す - 38間を
あけた 2 本の 指で 連結リストの 後ろから n 番目の節を外す - 39元の
節と 写しの 対応表で random つきの 連結リストを 丸ごと写す - 40繰り
上がりを 持ちながら、 1 の 位から 並んだ 2 本の 連結リストの数を足す - 41速い指と
遅い指で 連結リストの 輪を見つける - 42速い指と
遅い指で 並びの 中の 重なった数を探す - 43辞書と
双方 向リストで LRU キャッシュを設計する - 442 本ずつまとめて
k 本の 並んだ 連結リストを 1 本にする - 45つなぎ先の
付け替えで 連結リストを k 個ずつ逆順にする
木15 / 15 問
- 46再帰で
二分木を 左右反転する - 47深さ優先探索 (DFS) で
二分木の 深さを求める - 48再帰で
二分木の いちばん長い 道の 長さを求める - 49再帰で
二分木の 高さが 釣り合っているか確かめる - 50再帰で
2 本の 二分木が 同じか確かめる - 51再帰で
二分木の 中に 別の 木と 同じ 部分木が あるか確かめる - 52二分探索木の
大小で 2 つの 節の 共通の 祖先を探す - 53幅優先探索 (BFS) と
キューで 二分木を 段ごとに読む - 54幅優先探索 (BFS) で
二分木を 右から 見た ときに 見える 節を並べる - 55深さ優先探索で
根からの 道で いちばん 大きい値を 持ち回り、 二分木の よい 節を数える - 56再帰で
二分探索木の 決まりを確かめる - 57スタックの
中順の 走査で 二分探索木の k 番目に 小さい値を探す - 58辞書と
再帰で 前順と 中順の 並びから 二分木を組み直す - 59再帰で
二分木の 道の 値の 合計が いちばん 大きくなる所を探す - 60前順の
走査で 二分木を 文字列に して、 文字列から 同じ木に組み直す
トライ木3 / 3 問
ヒープ7 / 7 問
バックトラック9 / 9 問
グラフ12 / 13 問
- 80幅優先探索 (BFS) で
グリッドの 島を数える - 81幅優先探索 (BFS) と
辞書で つながりの グラフを写し取る - 82深さ優先探索 (DFS) で
グリッドの いちばん 大きい島の 広さを求める - 83幅優先探索 (BFS) で
東と 西の 両方の 海へ 流れる 場所を探す - 84盤の
端から たどって 囲まれた 空き地だけを埋める - 85幅優先探索 (BFS) で
知らせが 全員に 届くまでの 分を数える - 86幅優先探索 (BFS) で
全部の 部屋から いちばん近い 出口までの 歩数を求める - 87トポロジカルソートで
全部の 講座を 受けられるか調べる - 88トポロジカルソートと
ヒープで 講座を 受ける 順を決める - 89素集合 (Union-Find) で
木に 1 本だけ足された 余分な 道を見つける - 90つながった組の数準備中
- 91幅優先探索 (BFS) の
色塗りで、 つながった 2 人を 別の 組に 分けられるか調べる - 92幅優先探索 (BFS) で
言葉の 梯子の いちばん短い 長さを求める
グラフの応用6 / 6 問
1 次元の動的計画法12 / 12 問
- 99動的計画法 (DP) で
階段の 上り方を数える - 100動的計画法で
通行料つきの 階段を いちばん安く上る - 101動的計画法で
隣り合わない 要素の 合計を 最大にする - 102動的計画法で
輪に なった 並びから 隣り合わない 合計を 最大にする - 103まん中から
広げて 最も 長い 回文の 部分文字列を探す - 104まん中から
広げて 回文に なっている 部分文字列を 全部数える - 105動的計画法で
数字だけの 暗号を 文字に 戻す読み方を数える - 106動的計画法 (DP) で
おつりの 硬貨の 枚数を 最も 少なくする - 107動的計画法で
最大と 最小の 積を 持ち 歩き、 積が 最大の 続いた 区間を求める - 108動的計画法で
文字列を 辞書の 単語に 区切れるか調べる - 109動的計画法 (DP) と
二分 探索で 最長の 増える 部分列を求める - 1100-1 ナップサックで
荷物を 同じ 重さの 2 組に分ける
2 次元の動的計画法11 / 11 問
- 111動的計画法で
碁盤の 目の 左上から 右下への 道順を数える - 112動的計画法で
2 つの 文字列に 共通する 最長の 部分列を求める - 113動的計画法で
売った 次の 日は 買えない 決まりの 売り 買いの 利益を 最大にする - 114動的計画法で
硬貨の 組み合わせが 何通り あるかを数える - 115部分和の
数え上げで 符号の 付け方を数える - 116動的計画法で
2 つの 文字列を 順を 保って 混ぜると 3 つ目に なるか調べる - 117動的計画法で
低い マスから 順に 埋め、 グリッドの 上り続ける 最長の 道を求める - 118動的計画法で
文字列から 別の 文字列を 拾い出す方法を数える - 119動的計画法で
2 つの 単語の 編集距離を求める - 120区間の
動的計画法で 最後に 割る 風船を 決め、 得点の 合計を 最大にする - 121動的計画法で
ドットと アスタリスクの 入った 型が 文字列全体に 合うか調べる
貪欲法8 / 8 問
区間6 / 6 問
数学と幾何8 / 8 問
ビット演算7 / 7 問
そのほかの問題22 問
- ランレングス圧縮で
続く 同じ 文字を縮める - 割り算と
余りで 整数が 回文かを確かめる - 文字列の
単語を 逆順に 並べ替える - ハッシュで
最初の 重複しない 文字を探す - ツーポインタで
0 を 配列の 末尾へ移す - ソートと
ツーポインタで 目標に いちばん近い 3 つの 和を求める - 3 本の
指で 0 と 1 と 2 の 並びを 1 回で 並べ替える - ソートと
ツーポインタで 和が 目標に なる 4 つの 組を 全部集める - スライディングウィンドウで
続いた 1 の 最長を数える - スライディングウィンドウで
幅 k の 平均が 最大の所を探す - 再帰で
入れ子の 配列を 平らにする - 二分探索で
挿入位置を求める - 二分探索で
同じ 値が 続く 範囲の 両端を探す - 二分探索で
上って 下る 並びの 頂上を探す - 深さ優先探索で
二分木の 根から 葉までの 合計を調べる - 再帰で
二分木の 2 つの 節に いちばん近い 共通の 祖先を探す - 再帰で
並びから 高さの そろった 二分探索木を作る - 繰り返しで
二分探索木に 新しい 値を 葉として足す - 再帰で
二分探索木から 値を 消して 木を つなぎ直す - 幅優先探索 (BFS) で
グリッドの 最短の 道を数える - 素集合 (Union-Find) で
つながった 町の まとまりを数える - 辞書と
並びを 組み合わせて O(1) で 出し入れと 無作為な 取り出しが できる 集合を作る
解いた
言葉で