
В сегодняшнем алгоритме мы создадим функцию диагональной разницы. Для этой функции вы получите на вход многомерный массив. Многомерный массив — это массив, содержащий массивы.
В этой функции вы будете вычислять и возвращать абсолютную разницу между суммами его диагоналей.
Если вы посмотрите на изображение поста выше, подумайте о входном массиве как о сетке крестиков-ноликов. Каждый элемент массива будет содержать массив из трех значений. В каждой строке вы вычисляете синие ирозовые кружки в этой строке. Другими словами, в примере массива:
[[1,2,3], [4,5,6], [7,8,9]]
Вы также можете расположить массив так, чтобы его было легче читать и он напоминал сетку крестиков-ноликов:
[ [1,2,3], [4,5,6], [7,8,9] ]
Диагональ, идущая слева направо, будет равна 1,5 и 9. Диагональ, идущая справа налево, будет равна 3, 5, 7. Конечная цель состоит в том, чтобы взять сумму диагонали слева направо и вычесть его из суммы диагоналей справа налево. Помните, что вы возвращаете абсолютную разницу, поэтому, если сумма становится отрицательным числом, вы получаете абсолютное значение этого числа и возвращаете результат.
Превратим это в код.
Мы создаем ряд переменных:
let forwardIndex = 0; let backwardsIndex = arr.length - 1; let forwardCount = 0; let backwardsCount = 0;
Переменная forwardIndex будет действовать как индекс для каждого массива, чтобы получить числа по диагонали слева направо.
Переменная backwardsIndex будет действовать как индекс для каждого массива, чтобы получить числа по диагонали справа налево. Поскольку мы начинаем с конца массива, мы получаем длину массива и вычитаем ее из единицы (компьютеры начинают считать с нуля, а не с единицы).
Переменная fowardCount будет содержать сумму диагоналей слева направо.
Переменная backwardsCount будет содержать сумму диагоналей справа налево.
Далее следует использовать цикл for для перебора входного массива:
for(let i = 0; i < arr.length; i++){
forwardCount += arr[i][forwardIndex];
backwardsCount += arr[i][backwardsIndex];
forwardIndex++;
backwardsIndex--;
}
В первой строке внутри цикла for мы перебираем каждый массив внутри основного массива. Наша переменная forwardCount начинает с захвата первого элемента, в то время как переменная backwardsCount захватывает последний элемент.
По мере того, как цикл for проходит через каждый массив, forwardIndex увеличивается. Он работает слева направо. В первом массиве он захватывает первое значение первого массива, затем второе значение второго массива и т. д. С другой стороны, backwardsIndex уменьшается. Он работает в обратном порядке справа налево и уменьшает свое значение для каждого массива.
Чтобы получить доступ к значению в многомерном массиве, вы используете обозначение скобок [i][j]. Примером является arr[1][2]. Первая скобка означает, что число находится в массиве, который является вторым элементом в массиве arr. Вторая скобка означает, что число находится в третьем элементе этого второго массива.
Значения по диагонали слева направо добавляются к forwardCount каждый раз. То же самое происходит со значениями по диагонали справа налево к переменной backwardsCount.
После завершения цикла for последнее, что нужно сделать, — это вычесть результаты forwardCount из backwardsCount. Поскольку вы возвращаете абсолютное значение этого результата, вы будете использовать метод Math.abs().
return Math.abs(forwardCount - backwardsCount);
И это все.
Вот остальная часть кода:
function diagonalDifference(arr) {
let forwardIndex = 0;
let backwardsIndex = arr.length - 1;
let forwardCount = 0;
let backwardsCount = 0;
for (let i = 0; i < arr.length; i++) {
forwardCount += arr[i][forwardIndex];
backwardsCount += arr[i][backwardsIndex];
forwardIndex++;
backwardsIndex--;
}
return Math.abs(forwardCount - backwardsCount);
}
Вот еще несколько статей об алгоритмах JavaScript. Еженедельно добавляется новый: