一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)

来源:互联网 发布:linux系统日志路径 编辑:程序博客网 时间:2024/05/01 14:30

Cracking the coding interview--Q1.6

December 8, 2012
作者:Hawstein
出处:http://hawstein.com/posts/1.6.html
声明:本文采用以下协议进行授权: 自由转载-非商用-非衍生-保持署名|Creative Commons BY-NC-ND 3.0 ,转载请注明作者及出处。

题目

原文:

Given an image represented by an NxN matrix, where each pixel in the image is 4 bytes, write a method to rotate the image by 90 degrees. Can you do this in place?

译文:

一张图像表示成NxN的矩阵,图像中每个像素是4个字节,写一个函数把图像旋转90度。 你能原地进行操作吗?(即不开辟额外的存储空间)

解答

我们假设要将图像逆时针旋转90度,顺时针是一个道理。如果原图如下所示:

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

那么逆时针旋转90度后的图应该是:

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

我们要如何原地进行操作以达到上面的效果呢?可以分两步走。 第一步交换主对角线两侧的对称元素,第二步交换第i行和第n-1-i行,即得到结果。 看图示:

原图:           第一步操作后:   第二步操作后:1 2 3 4         1 5 9 13        4 8 12 165 6 7 8         2 6 10 14       3 7 11 159 10 11 12      3 7 11 15       2 6 10 1413 14 15 16     4 8 12 16       1 5 9 13

代码如下:

#include <iostream>using namespace std;void swap(int &a, int &b){    int t = a;    a = b;    b = t;}void transpose(int a[][4], int n){    for(int i=0; i<n; ++i)        for(int j=i+1; j<n; ++j)            swap(a[i][j], a[j][i]);    for(int i=0; i<n/2; ++i)        for(int j=0; j<n; ++j)            swap(a[i][j], a[n-1-i][j]);}int main(){    int a[4][4] = {        {1, 2, 3, 4},        {5, 6, 7, 8},        {9, 10, 11, 12},        {13, 14, 15, 16}    };    for(int i=0; i<4; ++i){        for(int j=0; j<4; ++j)            cout<<a[i][j]<<" ";        cout<<endl;    }    cout<<endl;    transpose(a, 4);    for(int i=0; i<4; ++i){        for(int j=0; j<4; ++j)            cout<<a[i][j]<<" ";        cout<<endl;    }    return 0;}

全书题解目录:

Cracking the coding interview—问题与解答

全书的C++代码托管在Github上:

https://github.com/Hawstein/cracking-the-coding-interview

 

将M*N的矩阵旋转90度

分类: 面试/笔试 88人阅读 评论(0) 收藏 举报

  请用最少的额外空间将一个M*N的矩阵旋转90度,写出算法描述和类c语言程序。(这是一道阿里巴巴的笔试编程题目)

[cpp] view plaincopyprint?
  1. <span style="font-size:14px">#include <iostream>  
  2. using namespace std;  
  3. const int M = 5;  
  4. const int N = 3;  
  5.   
  6. int main()  
  7. {  
  8.   int a[M][N] = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};  
  9.   int *p = a[0];  
  10.   
  11.   for(int i = 0;i < M;i++) // M = 5   
  12.   {  
  13.     for(int j = N-1;j >= 0;j--) // N = 3  
  14.     {  
  15.         cout << *(p + i + j*M) << ","// M = 5;  
  16.     }  
  17.     cout << endl;  
  18.   }    
  19.   return 0;  
  20. }</span>  

运行结果:



 我的思路是:每一次把矩阵为中心的每一圈旋转90度,把每一圈看做一个一维数组,循环移动

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 脸变得很交黑怎么办 玩手机长痘痘了怎么办 青少年左侧后背突发疼痛怎么办 纵欲过度导致青少年白发怎么办 20岁了不想长大怎么办 网吧老板跑路了怎么办 网吧玩地下城卡怎么办 个人公积金封存之前厂子欠费怎么办 学生欠了2万块怎么办 玉米去完库存量cool怎么办 幸福蓝海电子券过期怎么办 幸福蓝海国际影城会员怎么办 幸福蓝海会员卡过期了怎么办 电机线圈处于平衡位置怎么办 混联电路求电功率最小怎么办 电脑超出工作频率范围怎么办 手机红外线感应器坏了怎么办 我的世界左右慢怎么办 发电机自动启停装置故障怎么办 如果自动启停没关发动机涉水怎么办 偏激的人不分手怎么办 被极端的人纠缠怎么办 对固执偏激的人怎么办 车子右前轮偏磨怎么办? 轮胎边缘磨黑了怎么办 36周胎儿绕颈一周怎么办 孕中期胎儿偏小怎么办 怀孕34周偏小2周怎么办 胎盘低怎么办6个月了 怀孕四个月胎盘低怎么办 怀孕五个月胎盘低怎么办 怀孕3个月胎盘低怎么办 怀孕三个月了胎盘低怎么办 新房交房开发商拿不出证件怎么办? 新干式变压器未送电进水怎么办 三相380转单相220怎么办 外国人一直找你出去怎么办 美团众包跑腿单物品太重怎么办 美团退款成功后 物品怎么办 win10电脑没有网络图标怎么办 电脑开机桌面什么都没有怎么办