Решаем задачку «Flipping an Image»

Условие

Дана матрица А (условно — изображение), необходимо отразить изображение по горизонтали, а после его инвертировать (имеется в виду преобразования вложенных массивов). Например, отразив по горизонтали массив [1, 1, 0], получим [0, 1, 1], а после инверсии (замена каждого значения на противоположное) — [1, 0, 0]. Метод должен вернуть преобразованный массив (изображение).

Ограничения:

1 <= A.length = A[0].length <= 20

0 <= A[i][j] <= 1

Given a binary matrix A, we want to flip the image horizontally, then invert it, and return the resulting image.
To flip an image horizontally means that each row of the image is reversed. For example, flipping [1, 1, 0] horizontally results in [0, 1, 1].
To invert an image means that each 0 is replaced by 1, and each 1 is replaced by 0. For example, inverting [0, 1, 1] results in [1, 0, 0].

Пример

Input: [[1,1,0,0],[1,0,0,1],[0,1,1,1],[1,0,1,0]]

Output: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]]

Explanation: После отображения по горизонтали: [[0,0,1,1],[1,0,0,1],[1,1,1,0],[0,1,0,1]]. После инверсии: [[1,1,0,0],[0,1,1,0],[0,0,0,1],[1,0,1,0]].

Решение

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

var flipAndInvertImage = function(A) {
   // line traversal
    for (let i = 0; i < A.length; i++) {
       // horizontal flip of a nested array
        const temp = A[i].reverse()
            .map(item => item === 0 ? 1 : 0); // inversion
	// overwriting the source array row
        A[i] = temp
    }
    // return the modified array
    return A;
};

С методами массивов можно познакомится здесь.

Russian
Прокрутить вверх