@Sylvester_Stallone

Как лучше развернуть двумерный массив?

Есть двумерный массив, задание развернуть его на 90 градусов. То есть сделать так, чтобы строки стали столбцами, а столбцы строками. Вот пример:
[                        [
    [1,2,3],              [1,1,1],
    [1,2,3],              [2,2,2],    
    [1,2,3]               [3,3,3]
    ]                               ]


Слева то что было, справо то что должно получиться.
Я это сделал, но вопрос в том нормально ли я это сделал?
Не будет ли считаться мой вариант shit-кодом?
let arr =
    [
    [1,2,3],
    [1,2,3],
    [1,2,3]
    ]


let row

for (let i = 0; i < arr.length; i++) {

    row = []

    for (let j = 0; j < arr[i].length; j++) {
        row.push(arr[j][i])
    }
    arr[i].push(...row)

}

for (let i = 0; i < arr.length; i++) {
    while (arr[i].length > 3) {
        arr[i].shift()
    }
}

console.log(arr)
  • Вопрос задан
  • 258 просмотров
Решения вопроса 2
wataru
@wataru Куратор тега Алгоритмы
Разработчик на С++, экс-олимпиадник.
Если не обязательно делать поворт на месте, то вся суть алгоритма вот в этой одной строке:
result[i][j] = arr[n-1-j][i];
Надо только циклы прогнать по нужным границам, да массив нужного размера создать.

Если матрица квадратная, то элементы сдвигаются по кругу в четверках - и это можно сделать без дополнительного массива . Можно делать сдвиг по кругу со временной переменной. Что-то вроде этого:
tmp = arr[i][j];
arr[i][j] = arr[n-1-j][i];
arr[n-1-j][i] = arr[n-1-i][n-1-j];
arr[n-1-i][n-1-j] = arr[j][n-1-i];
arr[j][n-1-i] = tmp;


И надо аккуратно границы цикла подобрать, чтобы там только левый верхний угол обработался. Иначе вы 4 раза в каждом круге сдвините, и ничего не поменяется.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы