Rotate Matrix Counter-Clockwise N Times in Java


The challenge

In this challenge your mission is to rotate matrix counter-clockwise N times.

So, you will have 2 inputs:

1) matrix

2) a number, how many times to turn it

And the output is turned matrix.

Example:

matrix = [[1, 2, 3, 4],
          [5, 6, 7, 8],
          [9, 10, 11, 12],
          [13, 14, 15, 16]]

times_to_turn = 1

It should return this:

[[4, 8, 12, 16],
 [3, 7, 11, 15],
 [2, 6, 10, 14],
 [1, 5, 9, 13]])

Note: all matrixes will be square. Also, random tests will have big numbers in the input (times to turn)

The solution in Java code

Option 1:

public class Solution {

    public static int[][] rotateCounterclockwise(int[][] matrix, int times) {
    
        int matlen = matrix.length;
    
        for (int n = 0; n < times % 4; n++) {
            int[][] element = new int[matlen][matlen];
            for (int i = 0; i < matlen; i++) {
                for (int j = 0; j < matlen; j++) {
                    element[i][j] = matrix[j][matlen - 1 - i];
                }
            }
          
            matrix = element;
        }
    
        return matrix;
    }
}

Option 2:

public class Solution {

  public static int[][] rotateCounterclockwise(int[][] matrix, int times) {
        int size = matrix.length;
        int mat[][] = new int[size][size];
        int temp[][];
        times = times % 4;
        
        if (times==0) return matrix;
        
        while(times-->0) {
            for(int i=0,y=0;i<size;i++,y++)
                for(int j=0,x=size-1;j<size;j++,x--)
                    mat[x][y]=matrix[i][j];
          
            if(times>0){
              temp=matrix;  
              matrix=mat;
              mat=temp;
            }
        }  
        return mat;

    }
}

Option 3:

public class Solution {

    public static int[][] rotateCounterclockwise(int[][] matrix, int times) {
        times = times % 4;
        while(times > 0) {
            matrix = rotateOnce(matrix);
            times--;
        }
        return matrix;
    }
    
    private static int[][] rotateOnce(int[][] matrix) {
        int[][] r = new int[matrix.length][matrix.length];
        for (int i = r.length-1; i >=0; i--) {
            for (int j = 0; j < r.length; j++) {
                r[r.length-1-i][j] = matrix[j][i];
            }
        }
        return r;
    }
}

Test cases to validate our solution

import org.junit.Test;

import java.util.Random;
import java.util.function.BiFunction;
import java.util.function.IntFunction;
import java.util.function.IntSupplier;
import java.util.stream.IntStream;
import java.util.stream.Stream;

import org.junit.Assert;

public class SolutionTest {

    @Test
    public void exampleTest() {
    	  
    	Assert.assertArrayEquals(new int[][] {
            {2, 4},
            {1, 3}},
      Solution.rotateCounterclockwise(new int[][] {
            {1, 2},
            {3, 4}}, 1));
            
    	Assert.assertArrayEquals(new int[][] {
            {4, 8, 12, 16},
            {3, 7, 11, 15},
            {2, 6, 10, 14},
            {1, 5, 9, 13}}, 
    	Solution.rotateCounterclockwise(new int[][] {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 16}}, 1));
            
    	Assert.assertArrayEquals(new int[][] {
            {16, 15, 14, 13},
            {12, 11, 10, 9}, 
            {8, 7, 6, 5}, 
            {4, 3, 2, 1}},
    	Solution.rotateCounterclockwise(new int[][] {
            {1, 2, 3, 4},
            {5, 6, 7, 8},
            {9, 10, 11, 12},
            {13, 14, 15, 16}}, 2));
            
    	Assert.assertArrayEquals(new int[][] {
            {57, 49, 41, 33, 25, 17, 9, 1},
            {58, 50, 42, 34, 26, 18, 10, 2},
            {59, 51, 43, 35, 27, 19, 11, 3},
            {60, 52, 44, 36, 28, 20, 12, 4},
            {61, 53, 45, 37, 29, 21, 13, 5},
            {62, 54, 46, 38, 30, 22, 14, 6},
            {63, 55, 47, 39, 31, 23, 15, 7},
            {64, 56, 48, 40, 32, 24, 16, 8}},
    	Solution.rotateCounterclockwise(new int[][] {
            {1,  2,  3,  4,  5,  6,  7,  8},
            {9,  10, 11, 12, 13, 14, 15, 16},
            {17, 18, 19, 20, 21, 22, 23, 24},
            {25, 26, 27, 28, 29, 30, 31, 32},
            {33, 34, 35, 36, 37, 38, 39, 40},
            {41, 42, 43, 44, 45, 46, 47, 48},
            {49, 50, 51, 52, 53, 54, 55, 56},
            {57, 58, 59, 60, 61, 62, 63, 64}}, 3));
    }
}