昔、西への道がありました…
若いカウボーイは、指示に従い、ある場所から別の場所へ行かなければなりませんでした。このような指示「北」、「南」、「西」、「東」。
明らかに、「NORTH」と「SOUTH」は逆方向であり、「WEST」と「EAST」も逆です。
一方向に進んで戻るのは間違いなく無駄な努力です。
このアクセス不能な西部の荒野では、悪天候と乏しい水資源があるため、エネルギーを節約することが重要です。そうしないと、死んでしまう可能性があります。
どのように賢明なルートを取るかが非常に重要です!
次のようなカウボーイへの指示:
plan = ["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]
「北」と「南」を見れば、そのようなルートは明らかに無理であり、その場所に留まるのが最善であることが一目でわかります。あなたは。
つまり、あなたの仕事は、エネルギーを節約するためにルートを合理化することです。
より良い解決策は次のようになります:
plan = ["WEST"]
別の例:
["NORTH", "SOUTH", "EAST", "WEST"]
ここでは、"NORTH"と"SOUTH" はオフセットされ、"EAST" と "WEST" はオフセットされ、最後に空の配列が返されます。
より複雑な例を見てみましょう:
["NORTH", "EAST", "WEST", "SOUTH", "WEST", "WEST"]
"EAST", "WEST"オフセットすると、 ["NORTH", "SOUTH", "WEST", "WEST"]
"NORTH", "SOUTH" オフセットすると、最終的に ["WEST", "WEST" が得られます。 】 .
ただし、次の状況は相殺できないことに注意してください:
["NORTH", "WEST", "SOUTH", "EAST"]
because"EAST", "WEST" Or " NORTH」、「SOUTH」は隣接しているのではなく、離れています。
そのようなルート削減関数の書き方を見てみましょう。
文字列配列をパラメータとして受け取り、新しい文字列配列を返します。
次のように:
dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH", "WEST"]) // ["WEST"] dirReduc(["NORTH", "SOUTH", "SOUTH", "EAST", "WEST", "NORTH"]) // []
最初のステップは、反対方向である方向のマッピング関係を確立することです:
var opposite = { "NORTH":"SOUTH", "SOUTH":"NORTH", "EAST":"WEST", "WEST":"EAST" };
次に、文字列配列プランを後ろから前にたどって、逆方向の場合、配列から削除されオフセットされます。
次に、トラバーサル、削除、オフセットの 2 ラウンド目を開始し、3 ラウンド、N ラウンドを、反対方向が見つからなくなりループから抜け出すまで続けます。
この時の配列が合理化された最適ルートです。
function dirReduc(arr){ var flag = false; while(!flag){ for(var i=arr.length-2,flag=true;i>=0;i--){ if(opposite[arr[i]] === arr[i+1]){ arr.splice(i+1,1); arr.splice(i,1); i--; flag = false; } } } return arr; }
上記は JavaScript の楽しい質問: The Lost Cowboy の内容です。その他の関連コンテンツについては、PHP 中国語 Web サイト (m.sbmmt.com) に注目してください。