編集者の選択
有名IT企業の面接で目立って一躍有名になるにはどうすればいいでしょうか?本書は、あなたが持つべき「魔法の武器」です。この本を「磨けば」あなたも「質問王」に!
すべてのプログラマーにとって、アルゴリズムとデータ構造の能力を向上させることが重要です。数え切れないほどのプログラマーやプログラミング愛好家が質問の海で「立ち往生」しています。コーディング面接や能力向上のための質問に答えるのが気が進まない人でも、趣味でプログラミングに夢中になっている人でも、これはあなたのためのデスクブックです。値する。
ここでは、他では見つけることができない最適な解決策の分析、有名な IT コーディングのインタビューでよく出てくる実際の質問、驚くべき独創的な問題の解決策、仕事でのプログラミングの問題を解決するためのインスピレーションを見つけることができます...
バージョン 2 の説明:
1.初版から一部の問題の解説を改訂し、例題を追加しました。
2.多くの新しく人気のある面接の質問が追加され、古くなった頻度の低い面接の質問は削除されました。
3.問題解決ルーチンとアルゴリズムのプロトタイプに対して構造の調整と要約が行われました。
簡単な紹介
『プログラマーズコード面接ガイド(第2版)』は、プログラマーのためのコーディング面接ガイドです!この本は、有名な IT 企業におけるさまざまなコード面接の質問に対する最良の解決策を要約し、関連するコードの実装を提供します。プログラマー面接用の質問集が不足しているという現在の悩みに応えて、本書は、プログラマーが面接に十分に備えるのに役立つ、実際に発生したコード面接の古典的な質問を 200 個近く厳選しました。この本を「磨けば」あなたも「質問王」に!
『プログラマーズ・コード面接ガイド(第 2 版)』は、「質問 + 回答」方式で内容を整理し、面接の質問と似た種類の質問や、解決策が似ている質問をまとめて学習することで、読者が本書を学習する際に面接の質問を簡単に特定できるようにしています。ソリューション間の接続により、知識学習の断片化が防止されます。この本では、面接のすべての質問を難しいものから簡単なものまで「一般」、「大学」、「中尉」、「科学」の 4 つのレベルに分けており、読者が的を絞った「ブラシ」質問を選択しやすくなっています。本書に収録されているすべてのインタビュー質問には、最適解の説明とコード実装が含まれており、通常の解と最適解の実行時間の比較も提供されており、読者は最適解の魅力を実感することができます。
『プログラマのコード面接ガイド: (第 2 版)』の質問は網羅的かつ古典的ですが、さらに重要なのは、この本には多数の新しい質問と最適解分析が含まれていることです。これらの内容は、著者の「自己ノック」から導き出されたものです。長年にわたる深い思考。
プログラマーは有名IT企業の面接で目立って一躍有名になる準備はできているのでしょうか? 『プログラマーズ・コード面接ガイド(第2版)』は、あなたが持っておくべき「魔法の武器」です。もちろん、アルゴリズムやデータ構造の能力を向上させる必要があるプログラマーにとっても、『プログラマーズ コード インタビュー ガイド (第 2 版)』の価値は明らかです。
著者について
Zuo Chengyun は、華中科学技術大学とシカゴ大学で学部と修士号を取得し、国内外の多くの優れたインターネット企業で長年働いてきました。 2010 年からは質問に答えることに重点を置き、2015 年からは余暇を利用して Niuke.com プラットフォームでコード インタビューとアルゴリズムを教えています。
素晴らしい本のレビュー
【素敵な書評】
この本は、コーディング面接のガイドとしてだけでなく、学生やプログラマーの補助演習としても役立ちます。著者は長年このテーマに取り組み、そのすべてをこの本にまとめました。彼の指導に従い、最初から最後まで各ステップを克服すれば、報酬が得られます。
——Ye Xiangyu、Niuke.com CEO
エンジニアにとって、アルゴリズムは基本的な能力であると同時に、高度なブレークスルーに必要な能力でもあります。本書の内容は、アルゴリズムの知識そのものをカバーするだけでなく、読者が問題を解決するための思考をアップグレードできるように、平易かつ奥深い方法で説明されています。面接の準備でも、日々の勉強でも、この本はアルゴリズムの世界に入るのに最適な選択肢となります。
——GrowingIO CTO、Ye Dingding 氏
本書では、インターネット上の一般的な質問に答えることと比較して、最適な解決策と 1 つの例から推測する能力に重点を置いています。アルゴリズム プロトタイプの紹介は、プログラマーが面接の準備をしてより効率的に自己改善し、変化する質問からアイデアを素早く見つけるのにも役立ちます。
——Ju Lin氏、アリババダモアカデミー人工知能研究所技術専門家
誰もが分厚い古典本を買う余裕がありますが、それを読める人はほとんどいません。この本では、著者は一般的なアルゴリズムの知識についての独自の理解を使用して、実際の高頻度の面接の質問を慎重に選択し、質問の難易度を徐々に上げ、詳細な問題解決のアイデアを補足して、読者が内容とあなたを真に学ぶことができるようにします。学び続けることができます。
——Xu Yunzhao @imToken フルスタックエンジニアおよびブロックチェーン技術開発
この本は、面接の準備や質問に答える人にとって役立つだけでなく、アルゴリズムプロセスの最適化手法について多面的かつ詳細に説明されており、データ処理の仕事でアルゴリズム最適化クックブックとして読んだりもしています。 。さらに、Zuo 先生と協力する中で、彼の優れたアルゴリズム設計の多くも、この本の執筆中に基本的なアルゴリズムが蓄積され、析出したものであることがわかりました。したがって、面接に合格したすべての専門家にもお勧めします。
——Roy Yang 氏、GrowingIO フロントエンド マネージャー
Cheng Yun は、アルゴリズムの問題の主要なアイデアを常に明確かつ鋭敏に特定し、エレガントな実装を提供することができ、これには感銘を受けます。本書は彼の長年にわたる思考と蓄積を凝縮したものであり、プログラマーにとって複雑さを単純化し、問題解決を理解するための鍵を見つけるための良きガイドとなるものと信じています。この本はあなたが望むオファーを獲得するのに役立ちます。
——Toutiao社シニアエンジニア、Liu Yaodong氏
この本はインターネット企業の面接で問われるアルゴリズム質問のほとんどを網羅しており、就職活動に役立つだけでなく、実際の仕事にも大きな指針を与えてくれます。このテーマについての著者の説明は深くて新鮮で、アルゴリズムの問題はこうあるべきだと思わずにはいられません。
——Fu Qiang、シニア研究開発エンジニア
就職・転職活動中の方に最適なツールブック!著者は、豊富な実務経験とアルゴリズムへの深い理解に基づいて、コーディング面接の質問に対する最適な解決策を、鋭い例を通して簡潔かつ「親しみやすい」方法で説明します。
——シニアエンジニア ヤン・メン
目次
【目次】
第 1 章 スタックとキュー
└ getMin関数を使用したスタックの設計
└ 2つのスタックで構成されるキュー
└ 再帰関数とスタック操作のみを使用してスタックを反転する方法
└ 犬猫の行列
└ 1 つのスタックを使用して別のスタックのソートを実装する
└ スタックを使用してハノイの塔問題を解決する
└ ウィンドウ最大値配列の生成
└ モノトーンスタック構造
└ 最大の部分行列のサイズを求める
└ 最大値から最小値が num 以下の部分配列の数を引いた値
第2章 連結リスト問題
└ 見える山のペアの数
└ 2 つの順序付けされたリンク リストの共通部分を出力します。
└ 単結合リストおよび二重結合リストの最後から K 番目のノードを削除
└ リンクリストの真ん中のノードとa/bのノードを削除
└ 逆一方向および双方向リンクリスト
└ 一方向リンクリストの一部を反転
└循環単連結リストのジョセフ問題
└ リンクリストが回文構造かどうかを判定する
└ 一方向連結リストをある値で左小、中均等、右大の形に分割する
└ ランダムなポインタノードを含むリンクリストをコピーする
└ 2 つの単一リンク リストは加算的リンク リストを生成します
└ 単一リンクされた 2 つのリストが交差する場合の一連の問題
└ 単一リンクリスト内の各 K ノードの順序を逆にする
└ 順序なしの単一リンクリストで値が繰り返されているノードを削除します
└ 単一リンクリスト内の指定値を持つノードを削除
└ 探索二分木を二重連結リストに変換
└ 単一リンクリストの選択ソート
└ ノードを削除する奇妙な方法
└ 順序付けられた循環単一リンクリストに新しいノードを挿入します。
└ 順序付けされた 2 つの単一リンクリストをマージする
└ 単一リンクリストを左半分と右半分に合わせて再編成する
第 3 章 二分木問題
└ 再帰的メソッドと非再帰的メソッドを使用して、それぞれバイナリ ツリーの事前順序、順序内、および順序後の走査を実装します。
└ 二分木の境界ノードを出力する
└ より直観的に二分木を出力する方法
└ バイナリツリーのシリアル化と逆シリアル化
└ バイナリツリーをトラバースするための神レベルのメソッド
└ 二分木において累積和が指定値となる最長のパス長を求める
└ バイナリ ツリー内で最大の検索バイナリ サブツリーを見つける
└ 二分木の探索条件を満たす二分木の中で最大の位相構造を見つける
└ 二分木のレイヤーバイレイヤー印刷とジグザグ印刷
└ バイナリツリー内の 2 つの間違ったノードの検索を調整します。
└ t1 ツリーに t2 ツリーのトポロジ全体が含まれているかどうかを確認します。
└ t2 ツリーと同じ位相構造を持つサブツリーが t1 ツリーに存在するかどうかを確認します。
└ 二分木がバランスのとれた二分木であるかどうかを判断します。
└ 事後配列に基づいて検索二分木を再構築する
└ 二分木が探索二分木か完全二分木かの判定
└ 順序配列から平衡探索二分木を生成
└ 二分木内のノードの後継ノードを見つける
└ バイナリ ツリー内の 2 つのノードの最も近い共通の祖先を検索します。
└ Tarjan アルゴリズムと Union-find セットは、バイナリ ツリー ノード間の最も近い共通祖先のバッチ クエリ問題を解決します。
└ 二分木のノード間の最大距離問題
└ パーティの幸福度最大値
└ プリオーダー配列とインオーダー配列からポストオーダー配列を生成
└ さまざまな二分木をすべて数えて生成する
└ 完全な二分木のノード数を数える
第 4 章 再帰と動的プログラミング
└ フィボナッチ数列問題の再帰と動的計画法
└ 行列の最小経路和
└ 最低両替通貨金額
└ ロボットが指定位置に到達するまでの経路の数
└ 両替方法の種類の多さ
└風船ヒット時の最大スコア
└ 最長の増加部分列
└ エンベロープのネスティング問題
└ ハノイ塔問題
└ 最長共通部分列問題
└ 最長共通部分文字列問題
└ 部分配列の XOR 和が 0 となるパーティションの最大数
└ 最低編集費用
└ 文字列のインターリーブ構成
└ダンジョンズ&ドラゴンズのゲーム上の問題
└ 数値文字列を文字の組み合わせに変換する方法の数
└ 目的の結果をもたらす式の構成要素の数
└ ラインカードゲームの不具合
└ ジャンプゲーム
└ 配列内の最長の連続シーケンス
└ Nクイーン問題
第5章 文字列の問題
└ 2 つの文字列が互いに語形変化しているかどうかを判断します。
└ 2 つの文字列が互いにローテーション単語であるかどうかを判断します。
└ 整数文字列を整数値に変換
└ 文字列の統計文字列
└ 文字配列内のすべての文字が 1 回だけ出現するかどうかを判断します。
└ ソートされた配列内で null を含む文字列を検索する
└ 弦の調整・交換
└ 文字列を反転する
└完全シャッフル問題
└ 余分な文字を削除して辞書順で最小の文字列を取得します
└ 配列内の 2 つの文字列間の最小距離
└ 文字列変換パスの問題
└ 最小限の文字を追加して文字列全体を回文文字列にします
└ 括弧文字列の有効性と有効な最大長
└ 数式文字列の評価
└ 0 の左側に 1 が必要なバイナリ文字列の数
└ すべての文字列を連結して、辞書順で最小の大文字文字列を生成します。
└ 文字の繰り返しを含まない文字列の最長の部分文字列を検索します。
└ 指定された新しいタイプのキャラクターを検索します
└ リゾルバ文字列の問題
└ 部分文字列の最小長
└ 回文の最小分割数
└文字列一致問題
└ 辞書ツリー(接頭辞ツリー)の実装
└ 部分配列の最大 XOR 和
第 6 章 ビッグデータとスペースの制約
└ ブルームフィルターを理解する
└ わずか 2GB のメモリを使用して、20 億の整数の中から最も頻度の高い数値を見つけます
└ 40億個の非負の整数の中から出現しない数を探す
└ 100億のURLの中から重複するURLや検索語の上位K件の質問を見つける
└ 40億個の非負の整数の中から2回出現する数値と全数値の中央値を求めます。
└ コンシステントハッシュアルゴリズムの基本原理
└島問題
第7章 ビット演算
└ 余分な変数を使わずに 2 つの整数の値を交換する
└ 比較判断を行わずに2つの数値のうち大きい方を求める
└ 算術演算を行わず、ビット演算のみを使用して整数の加算、減算、乗算、除算を実行します。
└ 整数の 2 進数表現には 1 がいくつありますか?
└ 他の数値が偶数回出現する配列の中で、奇数回出現する数値を見つけます
└ 他の数値が k 回出現する配列で 1 回だけ出現する数値を見つける
└ 第 8 章 配列と行列の問題
└ サークル印刷マトリックス
└ 正方行列を時計回りに90度回転
└ 「ジグザグ」印刷マトリクス
└ 順序なし配列内の最小の k 数値を検索します。
└ ソートする必要がある最短の部分配列の長さ
└ 配列内で N/K より多く出現する数字を見つける
└ 行と列をソートした行列から指定された数値を検索します。
└ 積分可能な最長の部分配列の長さ
└ ソートされた配列内の、合計が指定された値となるすべてのタプルとトリプルを繰り返しせずに出力します。
└ 累積和が指定された値になる、ソートされていない正の配列内の最長の部分配列の長さ
└ 累積和が与えられた値となる、ソートされていない配列内の最長の部分配列系列の問題
└ 累積合計が指定された値以下である、ソートされていない配列内の最長の部分配列の長さ
└ 配列の小さな和を計算する
└ 自然数配列のソート
└ 奇数の添字はすべて奇数、偶数の添字はすべて偶数
└ 部分配列の最大累積和問題
└ 部分行列の最大累積和問題
└ 配列内の極小位置を見つける
└ 配列内の部分配列の最大累積積
└ N 個の配列のうち最大の上位 K 個を全体として出力します
└ 枠線をすべて1にした最大の正方形サイズ
└ この位置の値を含まない乗数配列
└ 配列パーティション調整
└ 最短パス値を求める
└ 配列に現れない最小の正の整数
└ 配列をソートした後の隣接する数値間の最大差
└ プロジェクトの最大利益の問題
└ 金の延べ棒の最低コスト
└ 建物外形問題
└ ガソリンスタンドの出発点として最適
└ 水が溜まる容器の問題
第9章 その他のトピック
└ ランダム5個からランダム7個とその拡張
└ 2 つの数値の最大公約数を求める 1 行のコード
└ 階乗に関する質問が 2 つあります。
└ 点が四角形の内側にあるかどうかを判断します。
└ 点が三角形の内側にあるかどうかを判定します
└ 折り紙問題
━ 完璧に長方形にできるでしょうか?
└ リザーバーアルゴリズム
└ setAll関数を使ったハッシュテーブルの設計
└ leftMaxとrightMaxの差の最大値の絶対値
└ LRUキャッシュ構造の設計
└ LFUキャッシュ構造設計
└ RandomPool構造の設計
└ ユニオン検索の実装
└ [0,x) の範囲内の数値の出現確率を調整します。
└ パス配列は統計配列になります
└ 正の配列の最小の形成不可能な合計
└ 全範囲の数値を足し合わせるには、いくつの数値が必要ですか?
└ 文字列と数値の対応
└1からnまでの1の出現回数
└ N 個の数字から中程度の確率で M 個の数字を出力する
└ 数値が回文かどうかを判定する
└ 順序付けされた回転配列の最小値を見つける
└ 順序付けされた回転配列内の数値を検索する
└ 英語と中国語の数字の表現
└キャンディーシェアの質問
└ メッセージの受信と印刷のための構造設計
└ データストリームの中央値をいつでも見つけることができます
└ 並べ替えられた同じ長さの 2 つの配列の上位中央値を見つけます
└ ソートされた 2 つの配列から k 番目に小さい数値を見つけます
└ 2 つの順序付けされた配列間の和を加算する上位 k 個の問題
└出現回数上位k問
└マナッチャーアルゴリズム
└KMPアルゴリズム
└ チェスの駒をなくす問題
└ペインター問題
└郵便局の立地問題
序文/序文
序文
本を出版できるとは全く予想外でした。
そういった大企業に入りたければ、コーディング面接の質問を「ブラッシュアップ」して、コーディング面接の質問を練習する必要があることはずっと前から分かっていましたが、6年前のある日、突然コーディング面接がどんなものか見てみたい気分になりました。質問は次のようだったので、コード面接の質問を集めました。学べば学ぶほど、自分には何も得意ではないと感じてパニックになり、マージ ソートの完全なコードを書くのは非常に困難でした。 、本当に自信を持って自分はコンピューターサイエンスの学生だと言えるでしょうか?賢いことを好む人は常に非常に自信に満ちているため、この打撃は長くは続きませんでした。私は質問を「磨く」という問題に真剣に取り組むことに決めましたが、その時は自分がこれから何に直面するのか全く分かりませんでした。ましてや本を書くという考えすらありませんでした。
空き時間を利用して考えたのですが、質問を「やっているだけ」ではないでしょうか?他の人が書けるなら、私たちも書けます。最初は納得がいかないという心境だったので、自分に「できる」と言い聞かせたかったのです。このプロセスは間違いなく胸が張り裂けるようなもので、実際には理解できない非常に複雑度の低いアルゴリズムを目にするため、イライラして真夜中に眠れなくなることもよくあります。当時は、本の説明が表面的すぎる、ネット上の説明が散漫すぎる、コードが理解できないなど、完全に理解できる情報が見つからないと感じていました。最初は、質問を「推敲」しているときに、何度も諦めようと思いました。なぜなら、これらはすべてナンセンスだと思ったからです。なぜ私はこのような苦しみを見つけるために良い人生を手放したのでしょうか?でも、私は屈するつもりはありません。理解できない解決策もたくさんありますが、とても興味深いと思います。
私は購入できる関連書籍のすべてのトピックを勉強し、中国語であれ英語であれ、すべてを「かじって」読みました。それぞれの質問を書いた後、本の方法と繰り返し比較しました。 5、6冊の本を「かじって」から、初めて質問を「書く」ようになってから16か月が経ちました。本を書く?冗談は言わないでください、ちょうど見終わったところです。
「若い人たちは、いつも言い訳をします。『私には興味のないことだから、下手でも大丈夫です。でも、彼らが注意を払わないのは、直面している物事の中には、面白いことはいつもほんの少ししかないということです。 「そのせいで、物事を行うときの態度が常に非常に怠惰でネガティブになることがあり、それがあなたを怠け者にしてしまいます。自分が興味のあることに真剣に向き合うと、拳をしっかりと握ることができなくなることに気づきます。」私はよくこのことを思います。これは、私の学部の卒業プロジェクトの指導者であるガオ・ペンギーが言ったことです。はい!何かを徹底的に調べていないとしても、面白くないとは言わないでください。これは友愛ではなく、自分自身と真剣に向き合うことです。
「ブラッシング」質問のコードが 40,000 行に達したとき、私は基本的に国内外の人気の「ブラッシング」質問サイトを毎日利用するようになりました。第一段階では、この不完全性は包括的です。
例えば:
記事の前後のコンテキストが分離されていることがよく見られ、著者は以前の優れた解決策に基づいてより良い最適化方法を提案することがよくありますが、記事全体では以前の解決策が何であったかについては言及されていません。これでは初心者には理解できません。
ほとんどすべての本は例によってもたらされる指導的役割を無視しており、多くの本では解決策を説明するときに疑似コードしか書かれていないため、読者が意味を理解し、実際にコードを自分で書けるようになるまでにはギャップが残されています。 。
コーディング面接の質問は「多い」「複雑」「難しい」という特徴があり、学習を始めてから最終的に望む効果に至るまで、自分自身を評価することは不可能です。 「ゆっくり練習せよ、学習に制限はない」という考え方が主流になっており、必然的に疑問が生じます。
新しい面接の質問を見たとき、どこから始めればよいのかまだわかりません。これまでの研究での 1 つの例から推論を導き出すことができず、これまでに行った質問の要約や誘導が不足しているためです。
「ブラッシング」質問は「賢い人」だけに向いているというのは本当でしょうか?ほとんどの内容は議論の段階にあるので、原論文を読んで勉強することにします。
当時、私は一人で海外にいたのを覚えています。初冬のある日の午後、私は 2 年間「質問」をし続けていました。夕食を食べようとしたとき、突然、昼食を食べるのを忘れていたことを思い出し、急いで行きました。食べ物を探すために家を出る。セブンイレブン前の広場に立った私は、1ドル50セントのホットドッグと75セントのコーヒーを抱え、生ぬるい日差しが照りつけながら、消えていく太陽を遠くから眺めていた。立ち止まって、斑点のある石のカウンターにコーヒーを置きました。手に持ったホットドッグはとても美味しかったし、ソーセージと玉ねぎはとても新鮮でした。冷たい空気が吹き抜けて、私の気分はさらに複雑になりました。サンフランシスコの空は非常にカラフルなので、放浪者はめまいを感じます。家が恋しいことを除けば、どうして自分が本を出版するなどと想像することができたでしょうか。
インターネットで新しい質問を検索するのが難しいことに気づいたとき、私はすでに 2 つの会社を変更し、600 を超える質問を繰り返し実装し、ほぼ 100,000 行のコードを書きました。就職活動のために質問を「やるだけ」という当初の目的はとうに忘れ去られ、それが趣味となって長く続いていたことが分かり、自分でも驚きました。さらに不思議なことに、私はそれがとても楽しくて、コミュニケーションをとりたいという気持ちがますます強くなり、同僚とよくそのことについて議論しています。多くの本に書かれている解決策は最適ではないことがわかりました。多くの問題は、実際には同僚と話し合った方がうまく解決できます。専門家はたくさんいるようですが、書くのが面倒なようです。
ある日、自分が書いたタイトルを見て、あの「心が張り裂けるような」日々を思い出して、急に「本なんて出さないほうがいいんじゃない?」と思ったのです。この気持ちなしでは生きていけない これが本当の愛じゃないとしたら何が?
これは感動的な話ではなく、質問に「答える」のが大好きな人が、多くの最良の解決策を説明しようと決めたプロセスです。
左成雲
2015 年 7 月 20 日
レビュー{{'('+ commentList.posts_count + ')'}}
商品レビューを書いて、他のユーザーを助ける最初の人になりましょう。
レビューを書く{{i}}星
{{i}} 星
{{ parseInt(commentRatingList[i]) }}%
{{ showTranslate(comment) }}非表示にします
{{ strLimit(comment,800) }}すべて見る
Show Original{{ comment.content }}
{{ formatTime(comment.in_dtm) }} 購入済み {{groupData}}
{{ showTranslate(comment) }}非表示にします
{{ strLimit(comment,800) }}すべて見る
Show Original{{ comment.content }}
{{ formatTime(comment.in_dtm) }} 購入済み {{groupData}}
関連するコメントはありません~
レビュー詳細
{{commentDetails.user_name}}
{{ showTranslate(commentDetails) }}非表示にします
{{ strLimit(commentDetails,800) }}すべて見る
Show Original{{ commentDetails.content }}
{{ formatTime(commentDetails.in_dtm) }} 購入済み {{groupData}}
コメント{{'(' + replyList.length + ')'}}
{{ reply.reply_user_name }}コメント{{ reply.parent_user_name }}
{{ showTranslate(reply) }}非表示にします
{{ strLimit(reply,800) }}すべて見る
Show Original{{ reply.reply_content }}
{{ formatTime(reply.reply_in_dtm) }}
これまでのコメントは以上です!
コメントをお願いします
通報します
本当にレビューを削除してもよろしいですか?
キャンセル