
翻訳者から :Googleの従業員であるSteve Merritが 、典型的なプログラミングの問題をどのように解決するかについて語る記事の翻訳を公開しています。 この投稿は、主に初心者プログラマーに役立ちます。
この記事では、プロジェクトの作業中に発生する問題を最初から最後まで解決するための私の戦略について説明します。 私は、Googleの毎日のワークフローで、またすべてのレベル(同僚、ブートキャンプ、卒業生、大学生)のコーダーと作業するときに使用します。 構造化された手法により、デバッグに費やされる時間が最小限に抑えられると同時に、より優れたコードが作成されます。
ちなみに、同じ戦略は、大規模なテクノロジー企業のインタビューでよく機能します。 3年前、彼女のおかげでGoogleに就職しました。
「Habr」の読者には、「Habr」プロモーションコードを使用してSkillboxコースに登録すると10,000ルーブルの割引があります。
Skillboxの推奨事項:オンライン教育コース「Profession Java-developer」 。
ステップバイステップ
トピックを明らかにするために、典型的な問題の形で例を示します。
問題:「sourceStringとsearchStringの2行を指定すると、sourceStringがsearchStringに表示されるときに最初のインデックスを返す必要があります。 searchStringがsourceStringにない場合、-1を返します。
1.描く
すぐにコードを書き始めるのは良い考えではありません。 最初に、問題を解決する方法を概説する必要があります。 あなたの視点の仮説と証拠を形成することから始めます。 そして、明確な計画をすでに持っている場合にのみ、仕事に取り掛かります。 これを行わない場合、作業が既に開始されていると、個々のコードが互いに対応しないという事実に遭遇する可能性があります。
解決策は、タスクが単純に見える場合でも、多くの場合、自明ではありません。 紙の計画は、適切なアプローチを見つけ、他の状況で機能することを確認するのに役立ちます。 そして、コードの最初の行が書かれる前でさえ、あなたはこれらすべてを学びます。
ですから、コードを書き始めないでください、考えないでください。 働く時間はたくさんあります。 あなたは人間のコンピューターであり、問題を解決します。
解決アルゴリズムを紙に書きます。 計画の視覚化に役立つものがあれば、それを実行してください。 タスクは、キーボードなしで、鉛筆と紙で問題を解決することです。
簡単な入力を考え出します。 関数が「文字列を渡す」場合、「abc」が最初の優れた例です。 正しい結果がどうあるべきかを理解してください。 次に、問題をどのように理解したか、どのような手順が取られたかを考えます。
文字列には次の値があると想像してください。
sourceString: "abcdyesefgh"
searchString: "yes"
したがって、searchStringがsourceString内にあることがわかります。 しかし、どうやってこれに来たのでしょうか? sourceStringの先頭から開始し、最後までカウントし、3文字の各フラグメントを見て、「yes」という単語と一致するかどうかを確認しました。 たとえば、「abc」、「bcd」、「cde」などです。 インデックス4に到達したとき、「はい」を見つけたため、一致があると判断し、インデックス4から開始します。
研究所に教師がいて、ピーナッツバターサンドイッチの作り方を教えてほしいと頼まれました。 詳細で理解しやすい指示については、最高の評価が約束されました。
私は次のように書いた:
「ピーナッツバターを開いて、パンの上に広げます。 別のパンを上に乗せれば完了です。」
先生がバターを取り、まだビニール袋に入っているパンの上に広げるまで、私はそれを管理すると思った。
私の先生のようなプログラムは、タスクを可能にするために非常に詳細な指示を必要とします。 したがって、アルゴリズムを作成するときは、すべての可能性のあるシナリオをすべて提供するようにします。 一致が見つかったときに正しい答えを返すことは優れていますが、一致が見つからない場合でも答えを返す必要があります。
別のペアの行でもう一度試してみましょう。
sourceString: "abcdyefg"
searchString: "yes"
ここでは、sourceStringの先頭から始めて最後まで読み取り、3文字の各フラグメントを調べて、yesという単語と一致するかどうかを確認します。 インデックス4に到達すると、yefが見つかりました。これはほとんど偶然の一致でしたが、3番目の文字が異なるため不完全です。 したがって、行の終わりに達するまで読み続け、一致しないと判断したため、-1を返しました。
問題を解決するために実行する一連のステップ(プログラミングではこれをアルゴリズムと呼びます)を作成し、正しい結果が得られるたびにいくつかのシナリオを実行しようとしました。 現時点では、アルゴリズムが機能していることを確認できます。次は、それを形式化して、次のステップに進みます。
2.アルゴリズムを言葉で書く
これにより、手順が現実のものになります。つまり、後でコードを記述するときに参照できます。
- 行の先頭から開始します。
- 3文字すべての組み合わせ(またはsearchStringで指定されている文字数)を調べます。
- それらのいずれかがsearchStringと等しい場合、現在のインデックスを返します。
- 一致するものを見つけずに行の終わりに到達した場合、-1を返します。
3.擬似コードを書く
擬似コードは実際にはコードではありませんが、コードのふりをします。 アルゴリズムを考えると、私が話していることの例:
for each index in sourceString,
there are N characters in searchString
let N chars from index onward be called POSSIBLE_MATCH
if POSSIBLE_MATCH is equal to searchString, return index
at the end, if we haven't found a match yet, return -1.
次のような実際のコードのようにすることができます。
for each index in sourceString,
N = searchString.length
POSSIBLE_MATCH = sourceString[index to index+N]
if POSSIBLE_MATCH === searchString:
return index
return -1
4.可能なすべてをコードに変換します
次に、構文、関数パラメーター、および言語規則に注意する必要があります。 たぶんあなたはすべてを書くことはできません、それは普通です。 知っていることをコードに書いてください!
function findFirstMatch (searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = <the LENGTH chars starting at index i> if (possibleMatch === searchString) { return index; } } return -1; }
このコードの一部を空のままにしたことに注意してください。 これは意図的なものです! JavaScriptで文字列を処理するための構文はわかりませんでしたが、後で詳しく説明します。
5.運に頼らないでください
特に初心者プログラマーにとって、かなりよくある間違いは、ネットワーク上で見つかったものを使用することです。 見つかったフラグメントは、テストせずに自分のプロジェクトに挿入されるだけです。 理解できないプログラムのセクションが多いほど、作業が正常に完了するのは非現実的です。
不明な項目を追加すると、エラーの可能性が2倍になります。 その結果、プロセスは手に負えなくなります。
コメント:エラーの確率は、メルセンヌシーケンスを使用して計算できます。a(n)=(2 ^ n)-1
コードをテストします。 オンラインで何かを見つけるのはすばらしいことですが、プログラムにスニペットを追加する前に、このセクションをすべてとは別に試してください。
前の手順で、JavaScriptを使用して文字列の特定の部分を選択する方法がわからないと言った。 グーグルにしましょう。
https://www.google.com/search?q=how+to+select+part+of+a+string+in+javascript
最初の結果はw3schoolsからのものです。 少し時代遅れですが、動作します:
http://www.w3schools.com/jsref/jsref_substr.asp
substr(index、searchString.length)を使用して、sourceString部分を毎回強調表示する必要があると思います。 しかし、これまでのところこれは仮定であり、それ以上のものではありません。 最初に確認します。
let testStr = "abcdefghi"
let subStr = testStr.substr(3, 4); // simple, easy usage
console.log(subStr);
"defg"
subStr = testStr.substr(8, 5); // ask for more chars than exist
"i"
今、私はこの機能がどのように機能するかを正確に知っています。 したがって、このフラグメントをプログラムに追加すると、機能しない場合、追加されたセクションに問題がないことがすでにわかります。
そして最後に、コードの最後の部分を追加します。
function findFirstMatch(searchString, sourceString) { let length = searchString.length; for (let index = 0; index < sourceString.length; index++) { let possibleMatch = ( sourceString.substr(index, searchString.length)); if (possibleMatch === searchString) { return index; } } return -1; }
おわりに
最後まで読んだ場合は、ヒントを試してください。 対処できない問題を見つけます。 私はすべてが今うまくいくことを保証します。
幸運と幸せなコーディング!
Skillboxの推奨事項:
- 実践コース「Mobile Developer PRO」 。
- オンラインコース「ゼロからC#開発者 。 」
- 2年間の実践コース「私はPRO Web開発者です。 」