Как отформатировать данный массив (матрицу) по спирали (спиральная сортировка по улитке или по часовой стрелке) в JavaScript

Хотя вы, вероятно, абсолютно никогда не будете использовать что-то подобное в своей работе, потому что это вообще не имеет смысла, это упражнение очень распространено для домашней работы молодых программистов. Идея проста, но способ достичь не так много, у вас будет массив, который имеет несколько массивов внутри с квадратной или прямоугольной формой в грубом смысле слова, и задача состоит в том, чтобы создать функцию, которая возвращает массив с одним предметы, которые следуют за порядком спиральной формы или также хорошо известны как улитки, например, анализируют следующие примеры и ожидаемые результаты:

// Example 1.
var matrix1 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
]
// Expected = [1, 2, 3, 6, 9, 8, 7, 4, 5]
console.log(some_function(matrix1));
// Example 2.
var matrix2 = [
[1,  2 , 3,  4,  5 ],
[6,  7 , 8 , 9,  10],
[11, 12, 13, 14, 15],
[16, 17, 18, 19, 20]
]
// Expected = [1, 2, 3, 4, 5, 10, 15, 20, 19, 18, 17, 16, 11, 6, 7, 8, 9, 14, 13, 12]
console.log(some_function(matrix2));

Если вы все еще не получили его, посмотрите графическое объяснение на изображении этой статьи, где вы можете увидеть стрелку, следующую за структурированным массивом в форме улитки.

Реализация

Данная структура всегда будет одним массивом с несколькими массивами внутри, так что вы можете работать с ним как с квадратичным объектом, повторяющимся по всей строке и использующим некоторые флаги для возврата к каждой строке в соответствии со статусом сгенерированного массива:

/**
*  Given a matrix of m x n elements (m rows, n columns),
*  return all elements of the matrix in spiral order.
*  For example,
*  Given the following matrix:
*  [
*   [ 1, 2, 3 ],
*   [ 4, 5, 6 ],
*   [ 7, 8, 9 ]
*  ]
*
*
*  It should return [1, 2, 3, 6, 9, 8, 7, 4, 5].
*/
function spiral_traversal(array) {
var result = [];
if (array.length == 0 ){
return result;
}
var max = array[0].length -1;
// Grab the first row | result.push.apply(result,array[0])
for (var i=0;i<=max;i++){
result.push(array[0][i]);
}
// Grab the last column
for (var i=1;i=0;i--){
result.push(array[max][i]);
}
// Grab the first column
for (var  i=max-1;i> 0;i--){
result.push(array[i][0]);
}
subarray = [];
// Form the inner matrix
for (var i=1;i

С помощью этой функции вы сможете структурировать исходный массив с нужной формой:

var matrix1 = [
[1, 2, 3],
[4, 5, 6],
[7, 8, 9]
];
// Prints: [1, 2, 3, 6, 9, 8, 7, 4, 5]
console.log(spiral_traversal(matrix1));
Ссылка на основную публикацию
Adblock
detector