旋转矩阵, 数组是必考题。
经典的几个考题:
1. 旋转image by 90 degree, 【顺时针】 最好do it in place.
clockwise rotate的基本idea
1 2 3 7 4 1
4 5 6 ----> 8 5 2
7 8 9 9 6 3
先transpose 再flip symmetric
所以需要掌握transpose a matrix以及flip a matrix.
说实话我很讨厌这个方法,因为感觉这个和我们生活中旋转的方式不太一样。
Flip的实现方式:
matrix[i][j] = matrix[i][matrix.length-1-j]; //!! 正数第j个和倒数第j个互换。
今天又换了一种比较Intutive 的,但是很容易写错的方法。把整个2D array 看成一片一片的layer。每次rotate, 移动top, right, bot, left 各一个element 到下一个对应的layer上。也就是移动第一个top的东西到right第一个,移动right的第一个到bot的第一个,移动bot的第一个back to top的第一个。 然后移动top row的第二个到right的第二个,。。。
这道题的大概框架我很快就写出来了,但是一直有一点小bug。一个就是我一开始只用了4个变量top, right, bot, left想要通过调整这个就可以达成。但是怎么说比如你在第一行,你移动第一个,第二个,第三个。。。但是你这个时候是不可以调整left or right的变量的,否则你就不知道往哪个layer上扔了。这个需要一个新的变量,我这里用的叫position。后来又遇到一个bug。就是比如right的最上面一个要放在bottom的最右边一个。 但是怎么从右往左不断移动呢? 我一开始是写 right - position. 但是由于我的position 很有可能出现这种情况 right-col =2, position =1 那么我第一个access的就不是right col 2了,这个和逻辑不符合。所以我又加了一个新的counter变量 对所有倒着走的地方用。