How do you rotate a two dimensional array?

后端 未结 30 3088
耶瑟儿~
耶瑟儿~ 2020-11-22 02:43

Inspired by Raymond Chen\'s post, say you have a 4x4 two dimensional array, write a function that rotates it 90 degrees. Raymond links to a solution in pseudo code, but I\'d

相关标签:
30条回答
  • 2020-11-22 03:18

    #transpose is a standard method of Ruby's Array class, thus:

    % irb
    irb(main):001:0> m = [[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 1, 2], [3, 4, 5, 6]]
    => [[1, 2, 3, 4], [5, 6, 7, 8], [9, 0, 1, 2], [3, 4, 5, 6]] 
    irb(main):002:0> m.reverse.transpose
    => [[3, 9, 5, 1], [4, 0, 6, 2], [5, 1, 7, 3], [6, 2, 8, 4]]
    

    The implementation is an n^2 transposition function written in C. You can see it here: http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-transpose by choosing "click to toggle source" beside "transpose".

    I recall better than O(n^2) solutions, but only for specially constructed matrices (such as sparse matrices)

    0 讨论(0)
  • 2020-11-22 03:18

    here is my In Place implementation in C

    void rotateRight(int matrix[][SIZE], int length) {
    
        int layer = 0;
    
        for (int layer = 0; layer < length / 2; ++layer) {
    
            int first = layer;
            int last = length - 1 - layer;
    
            for (int i = first; i < last; ++i) {
    
                int topline = matrix[first][i];
                int rightcol = matrix[i][last];
                int bottomline = matrix[last][length - layer - 1 - i];
                int leftcol = matrix[length - layer - 1 - i][first];
    
                matrix[first][i] = leftcol;
                matrix[i][last] = topline;
                matrix[last][length - layer - 1 - i] = rightcol;
                matrix[length - layer - 1 - i][first] = bottomline;
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-22 03:20

    A couple of people have already put up examples which involve making a new array.

    A few other things to consider:

    (a) Instead of actually moving the data, simply traverse the "rotated" array differently.

    (b) Doing the rotation in-place can be a little trickier. You'll need a bit of scratch place (probably roughly equal to one row or column in size). There's an ancient ACM paper about doing in-place transposes (http://doi.acm.org/10.1145/355719.355729), but their example code is nasty goto-laden FORTRAN.

    Addendum:

    http://doi.acm.org/10.1145/355611.355612 is another, supposedly superior, in-place transpose algorithm.

    0 讨论(0)
  • 2020-11-22 03:20

    Implementation of dimple's +90 pseudocode (e.g. transpose then reverse each row) in JavaScript:

    function rotate90(a){
      // transpose from http://www.codesuck.com/2012/02/transpose-javascript-array-in-one-line.html
      a = Object.keys(a[0]).map(function (c) { return a.map(function (r) { return r[c]; }); });
      // row reverse
      for (i in a){
        a[i] = a[i].reverse();
      }
      return a;
    }
    
    0 讨论(0)
  • 2020-11-22 03:21

    PHP:

    <?php    
    $a = array(array(1,2,3,4),array(5,6,7,8),array(9,0,1,2),array(3,4,5,6));
    $b = array(); //result
    
    while(count($a)>0)
    {
        $b[count($a[0])-1][] = array_shift($a[0]);
        if (count($a[0])==0)
        {
             array_shift($a);
        }
    }
    

    From PHP5.6, Array transposition can be performed with a sleak array_map() call. In other words, columns are converted to rows.

    Code: (Demo)

    $array = [
        [1, 2, 3, 4],
        [5, 6, 7, 8],
        [9, 0, 1, 2],
        [3, 4, 5, 6]
    ];
    $transposed = array_map(null, ...$array);
    

    $transposed:

    [
        [1, 5, 9, 3],
        [2, 6, 0, 4],
        [3, 7, 1, 5],
        [4, 8, 2, 6]
    ]
    
    0 讨论(0)
  • 2020-11-22 03:23

    This is my implementation, in C, O(1) memory complexity, in place rotation, 90 degrees clockwise:

    #include <stdio.h>
    
    #define M_SIZE 5
    
    static void initMatrix();
    static void printMatrix();
    static void rotateMatrix();
    
    static int m[M_SIZE][M_SIZE];
    
    int main(void){
        initMatrix();
        printMatrix();
        rotateMatrix();
        printMatrix();
    
        return 0;
    }
    
    static void initMatrix(){
        int i, j;
    
        for(i = 0; i < M_SIZE; i++){
            for(j = 0; j < M_SIZE; j++){
                m[i][j] = M_SIZE*i + j + 1;
            }
        }
    }
    
    static void printMatrix(){
        int i, j;
    
        printf("Matrix\n");
        for(i = 0; i < M_SIZE; i++){
            for(j = 0; j < M_SIZE; j++){
                printf("%02d ", m[i][j]);
            }
            printf("\n");
        }
        printf("\n");
    }
    
    static void rotateMatrix(){
        int r, c;
    
        for(r = 0; r < M_SIZE/2; r++){
            for(c = r; c < M_SIZE - r - 1; c++){
                int tmp = m[r][c];
    
                m[r][c] = m[M_SIZE - c - 1][r];
                m[M_SIZE - c - 1][r] = m[M_SIZE - r - 1][M_SIZE - c - 1];
                m[M_SIZE - r - 1][M_SIZE - c - 1] = m[c][M_SIZE - r - 1];
                m[c][M_SIZE - r - 1] = tmp;
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题