首页 > 试题广场 >

像素翻转

[编程题]像素翻转
  • 热度指数:31132 时间限制:C/C++ 3秒,其他语言6秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

现有一个NxN的矩阵,阶数为N,请编写一个算法将矩阵顺时针旋转90度并将其作为返回值。要求不使用缓存矩阵,保证N不大于500,元素不大于256,每个元素用int表示。


测试样例:
[[1,2,3],[4,5,6],[7,8,9]],3
返回:[[7,4,1],[8,5,2],[9,6,3]]
推荐
思路:第一步:先将矩阵以次对角线互换 (如果是逆时针则为主对角线)
           第二步:交换第i行到第n-i-1行

上代码:

public class Transform {
     public static int[][] transformImage(int[][] mat, int n) {
        if (mat == null) {
           return null;
               }
    
         int temp = 0;
        for(int i=0;i<n-1;i++){
          for(int j=0;j<n-i-1;j++){
                 temp = mat[i][j];
                 mat[i][j] = mat[n-j-1][n-i-1];
                 mat[n-j-1][n-i-1] = temp; 
             }   
        }
         
         for(int i=0;i<(n/2);++i){
             for(int j=0;j<n;++j){
                 temp = mat[i][j];
                 mat[i][j] = mat[n-i-1][j];
                 mat[n-i-1][j] = temp;
             }
             
         }
         
         return mat;
         
     }
}

编辑于 2015-08-18 20:34:59 回复(7)
import java.util.*;

public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int[][] mat2=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                mat2[j][n-i-1]=mat[i][j];
            }
        }
        return mat2;
    }
}

发表于 2021-10-07 20:21:32 回复(0)
import java.util.*;

public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int temp;
        for (int m = 0; m < n; m++) {
            for (int i = 0; i < m; i++) {
                temp = mat[m][i];
                mat[m][i] = mat[i][m];
                mat[i][m] = temp;
            }
        }
        for (int m = 0; m < n; m++) {
            for (int i = 0; i < (n + 1) / 2; i++) {
                temp = mat[m][i];
                mat[m][i] = mat[m][n - i - 1];
                mat[m][n - i - 1] = temp;
            }
        }
        return mat;
    }
}


发表于 2020-02-08 14:30:54 回复(0)
import java.util.*;

public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        if(mat == null || n < 1)
            return null;
        int[] tmp = new int[n*n];
        int k = 0;
        for(int j = 0; j < n; j++){
            for(int i = n-1; i >= 0; i--){
                tmp[k++] = mat[i][j];
            }
        }
        k = 0;
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n; j++){
                mat[i][j] = tmp[k++];
            }
        }
        return mat;
    }
}

发表于 2019-11-30 15:32:16 回复(0)
[i,j]->[j,n-1-i]
[j,n-1-i]->[n-1-i,n-1-j]
[n-1-i,n-1-j]->[n-1-j,i]
[n-1-j,i]->[i,j]
注意循环,外层循环i:0->n/2,内层循环为j:i->n-i-2;
发表于 2018-09-14 16:37:36 回复(0)
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        int[][] arra= new int[n][n];
        for(int i = 0; i < n ; i++){
            for(int j = 0; j < n; j++){
               arra[j][n-1-i]=mat[i][j];
            }
        }
        return arra;
    }
}

发表于 2018-04-23 17:23:37 回复(0)
public int[][] transformImage(int[][] mat, int n) {
    if(mat==null || n<2)
        return mat;

    int[][] result=new int[n][n];

    for(int i=0;i<n;i++){//列
        for(int j=0;j<n;j++){
            result[j][i]=mat[n-1-i][j];
        }
    }

    return result;
}

编辑于 2017-09-11 16:01:25 回复(0)
public int[][] transformImage(int[][] mat, int n) {
        int [][] aa= new int[n][n];
        for(int i = 0; i < n ; i++)
        {
            for(int j = 0; j < n; j++)
            {
               aa[j][n-1-i]=mat[i][j];
            } 
        }
        return aa;
    }

发表于 2017-07-20 22:34:36 回复(0)
import java.util.*;
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int a[][]=new int [n][n];
        for(int i=0;i<n;i++){
            for(int r=0;r<n;r++){
                a[r][n-1-i]=mat[i][r];
            }
        }
        return a;
    }
}
发表于 2017-05-31 17:21:51 回复(0)
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int[][] reverse=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                reverse[j][n-i-1]=mat[i][j];
            }
            
        }
        return reverse;
    }
}
发表于 2017-05-18 21:40:03 回复(0)
//连个变量临时变量我都舍不得用 QAQ
//第一步,元素关于左下右上对角线互换
//第二步,元素交换i和n-1-i行

public int[][] transformImage(int[][] mat, int n) {
        if(mat==null||n<=1) return mat;
        for(int i=0;i<n-1;i++){ //y=x对角线元素互换
          for(int j=0;j<n-1-i;j++){
              mat[i][j]=mat[n-j-1][n-i-1]+mat[i][j];
              mat[n-j-1][n-i-1]= mat[i][j]-mat[n-j-1][n-i-1];
              mat[i][j]=mat[i][j]-mat[n-j-1][n-i-1];
          }
        }
        for(int i=0;i<n>>1;i++){//交换第i行与n-i-1行
            for(int j=0;j<n;j++){
                mat[i][j]=mat[n-i-1][j]+mat[i][j];
                mat[n-i-1][j]=mat[i][j]-mat[n-i-1][j];
                mat[i][j]=mat[i][j]-mat[n-i-1][j];
            }
        }
        return mat;
    }

编辑于 2017-05-10 20:53:31 回复(0)
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int[][] a = new int[n][n];
        for(int i = 0;i < n;i++) {
            for(int x = n-1,y = 0;x >= 0;x--,y++){
                a[i][y] = mat[x][i];
            }
        }
        return a;
    }
}

时间控制的不是很好,但是挺简单易懂的

发表于 2017-05-03 17:20:31 回复(0)
import java.util.*;

public class Transform {
    public int[][] transformImage(int[][] mat,int n)
    {
        //第一步:先将矩阵转置
        //第二步:交换第i行到第n-i-1行 总共3行,最高行序号2,毕竟序号从0计数
        int r,c;//行 列
        int temp;
        for(r=0;r<n;r++)
            for(c=r+1;c<n;c++)
            {
                temp=mat[r][c];
                mat[r][c]=mat[c][r];
                mat[c][r]=temp;
            }
        for(r=0;r<n;r++)
            for(c=0;c<n/2;c++)
            {
                temp=mat[r][c];
                mat[r][c]=mat[r][n-c-1];
                mat[r][n-c-1]=temp;
            }
        return mat;
    }
}

发表于 2017-04-12 17:45:51 回复(0)

import java.util.*;

public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int[][] arr = new int[n][n];
        for(int i = 0;i<mat.length;i++){
            for(int j = 0;j<n;j++){
                arr[i][j] = mat[n-1-j][i];
            }
        }
        return arr;
    }
}

发表于 2017-03-26 22:22:49 回复(0)
分了两步,先上下对称,然后转置
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int temp;
         for(int i=0;i<n/2;i++){
             for(int j=0;j<n;j++){
                 temp=mat[i][j];
                 mat[i][j]=mat[n-i-1][j];
                 mat[n-i-1][j]=temp;
             }
         }
         for(int i=0; i<n; i++){
             for(int j=i+1; j<n; j++)
             { 
             temp = mat[i][j];
             mat[i][j]=mat[j][i];
             mat[j][i] = temp;
             }
        }
        return mat;
    }
}
发表于 2017-03-15 11:00:37 回复(0)
import java.util.*;

public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
       
        int[][] res = new int[n][n];
        for (int i = 0; i < n; i ++) {
            for (int j = 0; j < n; j ++) {
                res[i][j] = mat[n-j-1][i];
            }
        }
        return res;
    }
}

发表于 2017-03-14 22:07:00 回复(0)
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        // 转置
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < i; j++) {
                swap(mat, i, j, j, i);
            }
        }

        // 交换
        for (int i = 0; i < n; i++) {
            for (int low = 0, high = n - 1; low < high; low++, high--) {
                swap(mat, i, low, i, high);
            }
        }
        return mat;
    }
    
    private void swap(int[][] mat, int x1, int y1, int x2, int y2) {
        int temp = mat[x1][y1];
        mat[x1][y1] = mat[x2][y2];
        mat[x2][y2] = temp;
    }
}

发表于 2017-03-11 09:56:17 回复(0)
 public int[][] transformImage(int[][] mat, int n) {
        // write code here
        int[][] result=new int[n][n];
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                result[j][n-i-1]=mat[i][j];
            }
        }
        return result;
    }








发表于 2017-01-12 14:53:17 回复(0)
import java.util.*;
public class Transform {
    public int[][] transformImage(int[][] mat, int n) {
        int [][]b=new int[n][n];
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++){
            b[i][j]=mat[n-1-j][i];
        }
        return b;
    }
}
发表于 2016-10-07 12:12:53 回复(0)