snail
11698 ワード
Codewars解答
snail問題
n x n
配列が与えられた場合、最も外側の要素から時計回りに移動し、中間要素として配列された配列要素を返します.
Example1:array = [[1,2,3],
[4,5,6],
[7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
Example2:array = [[1,2,3],
[8,9,4],
[7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]
に注意
array = [[1,2,3],
[4,5,6],
[7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
array = [[1,2,3],
[8,9,4],
[7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]
[]
として表示される.私の答え
パターン解析
例として、4 x 4配列値
[[1, 2, 3, 1],[4, 5, 6, 4],[7, 8, 9, 7],[7, 8, 9, 7]]
をsnail
関数の因数伝達として考慮する.返却が必要な価格は
[1, 2, 3, 1, 4, 7, 7, 9, 8, 7, 7, 4, 5, 6, 9, 8]
です.コードの作成
const snail = (array) => {
const resultArray = [];
if (array.length == 1 || array.length == 0)
resultArray.push(...array.shift());
while (array.length) {
resultArray.push(...array.shift());
array.forEach((row) => resultArray.push(row.pop()));
array
.pop()
.reverse()
.forEach((item) => resultArray.push(item));
array.reverse().forEach((row) => resultArray.push(row.shift()));
array.reverse();
if (array.length == 1) resultArray.push(...array.shift());
}
return resultArray;
};
snail
を生成する.resultArray
変数を生成する.1
の場合、0
の配列は形成されないため、spred構文を使用してn x n
に戻されます.resultArray
法を用いて抽出した.次いで、
shift()
法を用いてpush()
に入れる.resultArray
メソッドで元の配列が変更されたため、元の配列の最初の行は現在消えています.shift()
法を使用して残りのソース配列中の要素を行単位で循環させる.forEach()
法を使用して、コールバック関数に渡される行row
の最後尾要素を抽出する.pop()
メソッドを使用して、push()
メソッドが返す値をpop()
に入れます.resultArray
メソッドも元の配列を変更したため、残りの元の配列では右端の列も消えてしまった.pop()
法を用いて残りのソース配列の最後の行を選択する.右から左に移動する順序なので、
pop()
メソッドで返される行の順序をpop()
に逆さにします.reverse()
の方法を使用して、反転順序の最後の行の各要素をforEach()
のresultArray
に入れる.push()
メソッドを使用して元のスキーマを変更したため、残りの元のスキーマの一番下の行は消えました.pop()
で2行の上、下の順序を変更する.reverse
メソッドでコールバック関数に渡された行の最初の要素からforEach()
メソッドを減算し、shift()
でresultArray
を減算します.このため、7番から逆さになった原列を
push()
に並べ替えた後、reverse()
ゲートを通って長さwhile
になるまで繰り返し並べ替えます.このとき,最終到着時の配列の長さが
0
であれば,1つの要素しか残っていないので,1
文を再ループする必要はなく,最後の要素を入れるだけで終了する.while
変数の配列値を返します.他人を解く
buttonupbub (plus 67 more warriors)
function snail(array) {
var vector = [];
while (array.length) {
vector.push(...array.shift());
array.map(row => vector.push(row.pop()));
array.reverse().map(row => row.reverse());
}
return vector;
}
resultArray
が生成される.vector
法を使用して、元の配列の最初の行要素をshift()
配列に入れる.vector
メソッドでソース配列の要素行をループし、行のmap()
メソッドで最後の要素を除去し、pop()
配列に戻り値を入れます.モードの3番目から、実際には、行を逆さまにすると、行中の要素の順序も逆さまになり、モードの1番目から再適用され、
vector
モードパスの順序と同じになります!下図で説明しました.
つまり、
snail
パスは「ㄱ」の字で連続的に実現できます!驚かない?!このように問題を解決し続け、解決策の視野を広げ、より効果的に解決しようと努力する.
Reference
この問題について(snail), 我々は、より多くの情報をここで見つけました https://velog.io/@sozero/snailテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol