一道编程题,可能是我想复杂了

2018-02-24 18:15:05 +08:00
 imlink

题目

原矩阵 顺时针取值,
得到新的结果数组

下面是我的思路过程,有可能开始就想复杂了,导致中间需要创建很多辅助矩阵

思路

创建一个辅助顺序矩阵(对应原矩阵的每个元素的最终顺序 ),

顺序矩阵 然后在遍历原矩阵的时候,对照对应位置的顺序矩阵结果数组赋值。

步骤

  1. 得到顺序矩阵

    • 为了方面得到顺序矩阵,先产生一个圈数矩阵(对应原矩阵的每个元素所在的圈数)和一个顺序中间矩阵
      圈数矩阵+顺序中间矩阵=顺序矩阵

    思路:上图顺序矩阵中的 17 其实对应的顺序中间矩阵中的第二个圈的第一个数字 1,1 如何变成 17,17=1+第一个圈的长度( 16 ),每一个圈的长度都有一定的规律,
    缩写下:     2*(currentColumnNum+currentLineNum)-4
    数字意义: 长+宽+长+宽-重复计算的部分
    这里第三圈的外圈长度等于第一圈长度+第二圈的长度,第四也是如此依次递推,所以需要一个递推函数,单独计算外圈的总长度
    outSideLength = countOutSideLength({lineLength,columnLength,currentCircleNo})

    • 得到圈数矩阵的过程
      根据原矩阵初始化一个矩阵
      转换成最后转换成圈数矩阵

    • 得到顺序中间矩阵的过程
      用上面得到的圈数矩阵复制然后扩充得到一个新的矩阵 遍历内圈判断每个元素位于圈的上,右,下,左用一定规律得到顺序中间矩阵

    • 得到顺序矩阵
      遍历上面得到的顺序中间矩阵,每个元素加上外圈的总长度得到顺序矩阵(这部可以和上一步骤合并,在上一个的遍历内圈时同时加上外圈的总长度)

  2. 得到结果数组
    初始化结果数组为一个长度为原矩阵的长*宽的数组,遍历顺序矩阵 ,将对应的行和列的原矩阵 赋值给结果数组(比如顺序矩阵的第 4 行的第三列的对应的是 22,那么结果数组的( 22-1 )个元素为原矩阵的第 4 行的第三列对应的 13 )

2736 次点击
所在节点    问与答
21 条回复
kaifeii
2018-02-24 20:35:10 +08:00
@kaifeii 细节可能有错,大体就这么个意思,对于左上半部分对角线上的点来说,算是一圈开头。在这之前已经转过的圈的总和是 (总行数+总列数-2*对角线点的列)*2*对角线点的列。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/432309

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX