题目
原矩阵
顺时针取值,

得到新的结果数组
下面是我的思路过程,有可能开始就想复杂了,导致中间需要创建很多辅助矩阵
思路
创建一个辅助顺序矩阵(对应原矩阵的每个元素的最终顺序 ),
顺序矩阵
然后在遍历原矩阵的时候,对照对应位置的顺序矩阵给结果数组赋值。
步骤
-
得到顺序矩阵
- 为了方面得到顺序矩阵,先产生一个圈数矩阵(对应原矩阵的每个元素所在的圈数)和一个顺序中间矩阵
圈数矩阵
+顺序中间矩阵
=顺序矩阵
思路:上图顺序矩阵中的 17 其实对应的顺序中间矩阵中的第二个圈的第一个数字 1,1 如何变成 17,17=1+第一个圈的长度( 16 ),每一个圈的长度都有一定的规律,
缩写下:2*(currentColumnNum+currentLineNum)-4
数字意义: 长+宽+长+宽-重复计算的部分
这里第三圈的外圈长度等于第一圈长度+第二圈的长度,第四也是如此依次递推,所以需要一个递推函数,单独计算外圈的总长度
outSideLength = countOutSideLength({lineLength,columnLength,currentCircleNo})-
得到圈数矩阵的过程
根据原矩阵初始化一个矩阵
转换成
最后转换成圈数矩阵
-
得到顺序中间矩阵的过程
用上面得到的圈数矩阵复制然后扩充得到一个新的矩阵
遍历内圈判断每个元素位于圈的上,右,下,左用一定规律得到顺序中间矩阵
-
得到顺序矩阵
遍历上面得到的顺序中间矩阵,每个元素加上外圈的总长度得到顺序矩阵(这部可以和上一步骤合并,在上一个的遍历内圈时同时加上外圈的总长度)
- 为了方面得到顺序矩阵,先产生一个圈数矩阵(对应原矩阵的每个元素所在的圈数)和一个顺序中间矩阵
-
得到结果数组
初始化结果数组为一个长度为原矩阵的长*宽的数组,遍历顺序矩阵
,将对应的行和列的原矩阵
赋值给结果数组(比如顺序矩阵的第 4 行的第三列的对应的是 22,那么结果数组的( 22-1 )个元素为原矩阵的第 4 行的第三列对应的 13 )