Skip to content

Files

Latest commit

48c3c11 · Oct 31, 2020

History

History

day26

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
Oct 31, 2020
Oct 31, 2020
Jan 24, 2019
Jan 24, 2019

cover

Day 26 - Array Series Part 9: Spiral Matrix Generation and Matrix Spiral Copy

Question 1 - Spiral Matrix Generation (1D to 2D)

Question 1 -- Write a function that accepts an integer N and generates an NxN spiral matrix

Example

input: N=2
output:
[
    [1, 2],
    [4, 3]
]

input: N=3
output:
[
    [1, 2, 3],
    [8, 9, 4],
    [7, 6, 5]
]

Question 2 - Matrix Spiral Copy (2D to 1D)

Given a 2D array (matrix) inputMatrix of integers, create a function spiralCopy that copies inputMatrix’s values into a 1D array in a spiral order, clockwise. Your function then should return that array.

Example

input:  inputMatrix  = [ [1,    2,   3,  4,    5],
                         [6,    7,   8,  9,   10],
                         [11,  12,  13,  14,  15],
                         [16,  17,  18,  19,  20] ]

output: [1, 2, 3, 4, 5, 10, 15, 20, 19, 18, 17, 16, 11, 6, 7, 8, 9, 14, 13, 12]

ques

Solution to problem 1 - Spiral Matrix Generation

JavaScript Implementation

/**
 * Spiral Matrix Generation
 * @author MadhavBahl
 * @date 24/01/2019
 */

function spiralGeneration (num) {
    let spiral = [],
        topRow = 0,
        btmRow = num-1,
        leftCol = 0,
        rightCol = num-1,
        count = 1;
    
    // Initialize the spiral matrix with zeros
    for (let i=0; i<num; i++) {
        let thisRow = [];
        for (let j=0; j<num; j++) 
            thisRow.push (0);
        spiral.push (thisRow);
    }

    // Populate the matrix
    while ((topRow<=btmRow) && (leftCol<=rightCol)) {
        // Populate the top row
        for (let i=leftCol; i<=rightCol; i++) 
            spiral[topRow][i] = count++;
        topRow++;

        // Populate the right column
        for (let i=topRow; i<=btmRow; i++)
            spiral[i][rightCol] = count++;
        rightCol--;

        // Populate the bottom row IF toprow has not become greater than bottom row
        if (topRow <= btmRow) {
            for (let i=rightCol; i>=leftCol; i--)
                spiral[btmRow][i] = count++;
            btmRow--;
        }

        // Populate the left column IF rightCol has not become less than left Col
        if (rightCol >= leftCol) {
            for (let i=btmRow; i>=topRow; i--)
                spiral[i][leftCol] = count++;
            leftCol++;
        }
    }

    // Print the result
    console.log (spiral);
    return spiral;
}

spiralGeneration (2);
spiralGeneration (3);
spiralGeneration (4);
spiralGeneration (5);

Solution to problem 2 - Matrix Spiral Copy

JavaScript Implementation

function spiralCopy(inputMatrix) {
    // your code goes here
    let outputArray = [],
        numRow = inputMatrix.length,
        numCol = inputMatrix[0].length;
    
    let topRow   = 0,
        btmRow   = numRow - 1,
        leftCol  = 0,
        rightCol = numCol - 1;
  
    while ((topRow <= btmRow) && (leftCol <= rightCol)) {
        for (let i=leftCol; i<=rightCol; i++) {
            outputArray.push(inputMatrix[topRow][i]);
        }
        topRow++;

        for (let i=topRow; i<=btmRow; i++) {
            outputArray.push(inputMatrix[i][rightCol]);
        }
        rightCol--;

        if (topRow <= btmRow) {
            for (let i=rightCol; i>=leftCol; i--) {
                outputArray.push(inputMatrix[btmRow][i]);
            }
            btmRow--;
        }

        if (leftCol <= rightCol) {
            for (let i=btmRow; i>=topRow; i--) {
                outputArray.push(inputMatrix[i][leftCol]);
            }
            leftCol++;
        }
    }
    
    return outputArray;
}

console.log(spiralCopy([ [1,    2,   3,  4],
             [6,    7,   8,  9],
             [11,  12,  13,  14],
             [16,  17,  18,  19] ]));  
             // Should print [ 1, 2, 3, 4, 9, 14, 19, 18, 17, 16, 11, 6, 7, 8, 13, 12 ]

console.log(spiralCopy([ [1,    2,   3,  4,    5],
                         [6,    7,   8,  9,   10],
                         [11,  12,  13,  14,  15],
                         [16,  17,  18,  19,  20] ]));
// Should print [ 1, 2, 3, 4, 5, 10, 15, 20, 19, 18, 17, 16, 11, 6, 7, 8, 9, 14, 13, 12 ]