zoukankan      html  css  js  c++  java
  • 程序员面试金典-面试题 01.07. 旋转矩阵

    题目:

    给定一幅由N × N矩阵表示的图像,其中每个像素的大小为4字节,编写一种方法,将图像旋转90度。

    不占用额外内存空间能否做到?

    示例 1:

    给定 matrix =
    [
    [1,2,3],
    [4,5,6],
    [7,8,9]
    ],

    原地旋转输入矩阵,使其变为:
    [
    [7,4,1],
    [8,5,2],
    [9,6,3]
    ]
    示例 2:

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

    原地旋转输入矩阵,使其变为:
    [
    [15,13, 2, 5],
    [14, 3, 4, 1],
    [12, 6, 8, 9],
    [16, 7,10,11]
    ]

    分析:

    我们可以利用先上下交换,倒置一下,然后再对角线将元素交换。由于题目要求不占用额外空间,我们就不能利用临时变量来存储交换值,可以利用异或的性质来将两个元素交换。

    例如我们想交换两个变量a,b分别等于x,y

    首先a = a ^ b = x ^ y

    然后b = b ^ a = y ^ x ^ y = x此时b已经拿到了a原来的值。

    最后a = a ^ b = x ^ y ^ x = y成功交换

    程序:

    class Solution {
        public void rotate(int[][] matrix) {
            //上下交换
            int i = 0;
            int j = matrix.length-1;
            while(i < j){
                for(int k = 0; k < matrix.length; ++k){
                    matrix[i][k] = matrix[i][k] ^ matrix[j][k];
                    matrix[j][k] = matrix[j][k] ^ matrix[i][k];
                    matrix[i][k] = matrix[i][k] ^ matrix[j][k];
                }
                i++;
                j--;
            }
            //对角交换
            for(i = 0; i < matrix.length; ++i){
                for(j = i+1; j < matrix.length; ++j){
                    matrix[i][j] = matrix[i][j] ^ matrix[j][i];
                    matrix[j][i] = matrix[j][i] ^ matrix[i][j];
                    matrix[i][j] = matrix[i][j] ^ matrix[j][i];
                }
            }
        }
    }
  • 相关阅读:
    python 获取当前路径
    python 执行结果输出为txt
    python def 定义函数
    python:浅析python 中__name__ = ‘__main__’ 的作用
    python 数组新增或删除元素
    python在Windows安装PIL的方法
    静态路由学习总结
    zookeeper客户端命令行操作
    kudu安装过程中可能出现的问题
    sudo: /etc/sudoers is world writable|给用户添加权限报错
  • 原文地址:https://www.cnblogs.com/silentteller/p/12395657.html
Copyright © 2011-2022 走看看