首页 > 试题广场 >

像素翻转

[编程题]像素翻转
  • 热度指数: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)
#python:旋转前后对比,用列表生成式
def transformImage(self, mat, n):
    return [[mat[i][j] for i in range(n-1,-1,-1)] for j in range(n)]
发表于 2020-08-21 11:17:23 回复(0)
class Transform:
    def transformImage(self, mat, n):
        if n<=1:
            return mat
        for i in range(n>>1):
            for j in range(i,n-i-1):
                mat[i][j],mat[j][n-1-i],mat[n-1-i][n-1-j],mat[n-1-j][i]=mat[n-1-j][i],mat[i][j],mat[j][n-1-i],mat[n-1-i][n-1-j]
        return mat

发表于 2020-02-10 15:39:59 回复(0)
return [list(x[::-1]) for x in list(zip(*a))]
发表于 2019-06-30 14:24:46 回复(0)
语言是python2.7,思路是zip迭代 + map映射,参考了http://baijiahao.baidu.com/s?id=1579306472315552043&wfr=spider&for=pc     代码如下
# -*- coding:utf-8 -*-
class Transform:
    def transformImage(self, mat, n):
        mat.reverse()
        return map(list,zip(*mat))

发表于 2019-02-15 16:04:19 回复(0)

Python one line solution

return zip(*mat[::-1])
编辑于 2018-08-26 21:31:44 回复(7)
class Transform:
    def transformImage(self, mat, n):
        # write code here
        mat.reverse()
        return zip(*mat)

发表于 2017-05-08 10:02:46 回复(0)
class Transform:
    def transformImage(self, mat, n):
        return map(lambda x:list(x)[::-1], zip(*mat))

发表于 2016-12-28 14:02:57 回复(0)
分为两个步骤:
  • 顺时针旋转一圈
  • 走到下一圈至结束
旋转一圈注意不能使用辅助空间。可以使用一个临时变量来存放当前要旋转的元素
# -*- coding:utf-8 -*-
class Transform:
    def transformImage(self, mat, n):
        if n <= 1:
            return mat
        
        for i in xrange(n/2):
            self.transformRound(mat, i, n - 1 - i, n)
            
        return mat
        
        
    def transformRound(self, mat, start, end, n):
        if start == end:
            return
        
        for i in range(start, end):
            tmp = mat[start][i]
            mapd = n - 1 - i
            mat[start][i] = mat[mapd][start]
            mat[mapd][start] = mat[end][mapd]
            mat[end][mapd] = mat[i][end]
            mat[i][end] = tmp

发表于 2016-08-01 17:38:21 回复(0)