首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >破解编码采访,第6版,1.7

破解编码采访,第6版,1.7
EN

Stack Overflow用户
提问于 2019-07-21 12:52:33
回答 2查看 1.7K关注 0票数 2

给定由nxn矩阵表示的图像,其中图像中的每个像素为4个字节,编写一种方法将图像旋转90度。(到位)

我做了一个效率低下的解决方案,把每一行复制到一个临时文件中,然后执行交换,占用o(N)空间,下面的实际解决方案更好,但我不明白。

代码语言:javascript
运行
复制
def rotate_matrix(matrix):
    '''rotates a matrix 90 degrees clockwise'''
    n = len(matrix)
    for layer in range(n // 2):
        first, last = layer, n - layer - 1
        for i in range(first, last):
            # save top
            top = matrix[layer][i]

            # left -> top
            matrix[layer][i] = matrix[-i - 1][layer]

            # bottom -> left
            matrix[-i - 1][layer] = matrix[-layer - 1][-i - 1]

            # right -> bottom
            matrix[-layer - 1][-i - 1] = matrix[i][- layer - 1]

            # top -> right
            matrix[i][- layer - 1] = top
    return matrix

上面的代码是Python解决方案,

我不明白for循环,为什么它在n//2范围内,从第一层到n层-1。

此外,为什么这个问题提到了4个字节,它似乎是无用的信息。

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-21 13:51:06

考虑n是奇数还是偶数是很重要的,因为必须以微妙的不同方式来处理这个问题。然而,在任何一种情况下,广场都可以被分解成象限。

n是奇怪的:

广场被分成四个矩形象限。在双循环的每一次迭代中,准确地旋转了4个元素,其中一个来自每个象限。中间元素永远不会被访问,因为它在旋转时保持在中间。

代码语言:javascript
运行
复制
+-------+---+ 
| x   x | x | 
+---+---+   | 
| x | x | x | 
|   +---+---+ 
| x | x   x | 
+---+-------+

n甚至是这样的:

矩阵被分解成4个正方形象限。同样,在双循环的每一次迭代中,准确地旋转了4个元素,每个象限中有一个.在偶数情况下,必须移动每个元素(即没有完美的中心元素)。

代码语言:javascript
运行
复制
+-------+-------+
| x   x | x   x |
|       |       |
| x   x | x   x |
+-------+-------+
| x   x | x   x |
|       |       |
| x   x | x   x |
+-------+-------+

n // 2n - layer - 1只是伪装的地板和天花板功能。地板和天花板是需要的n是奇怪的情况。这些值用于在其中一个象限上设置一个迭代。然后,无论在其中一个象限中存在多少元素,都会出现4个交换(在top临时值的帮助下)。

票数 3
EN

Stack Overflow用户

发布于 2019-07-21 13:53:38

基本上,我们通过从外部边界旋转元素到矩阵的核心,顺时针交换元素。

让我们以以下矩阵为例:

代码语言:javascript
运行
复制
1  2  3  4
5  6  7  8
9  10 11 12
13 14 15 16

在第一次迭代中,我们关注外部元素:

代码语言:javascript
运行
复制
1  2  3  4
5  x  x  8
9  x  x  12
13 14 15 16

在这里,我们开始(内循环)顺时针交换所有元素。在我们的示例中,我们将4(在将其存储在临时变量中)替换为1,然后将1替换为13,依此类推。最后,我们用保存的4替换16,继续这样做,直到所有元素都被交换为止。因此,在外部循环的第一次迭代之后,我们的数组如下所示:

代码语言:javascript
运行
复制
13  9  5 1
14  6  7 2 
15 10 11 3
16 12  8 4

在那之后,我们移动到下一层。在我们的例子中,我们现在看一看:

代码语言:javascript
运行
复制
x  x  x x
x  6  7 x 
x 10 11 x
x x  x  x

我们再次逐一交换所有元素,如上面所示。我们有n/2层迭代,因为对于不均匀的n次迭代,最后一次迭代只留下一个元素,显然不需要旋转。

这给我们留下了:

代码语言:javascript
运行
复制
13  9 5 1
14 10 6 2 
15 11 7 3
16 12 8 4

这4个字节是像c这样的语言所需要的,在这里我们必须手动管理内存。它们的起源很可能是这样一个事实:每个像素由3种颜色(红色、绿色和蓝色)组成,每种颜色由8位(0-255)表示。此外,还可以有8位的不透明度。所以剩下32位=4字节。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57133411

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档