讲在前面的话,在leetcode刷到一道in-place的旋转图像的题,同时在想如果不原位旋转的话,肯定有其他简单的方法的,答案是肯定的。顺便写篇博客来记录一下Python中的反转list的方法。
1.Python中反转list的几种简单方法
1.1 使用reversed()的函数,它是一个生成器,返回一个对象
nums = [1,2,3,4,5]
reversed_nums = list(reversed(nums))
print(reversed_nums) # [5, 4, 3, 2, 1]
1.2 使用列表中的切片
nums = [1,2,3,4,5]
reversed_nums = nums[::-1]
1.3 使用list的reverse方法(in-place)
nums = [1,2,3,9,4,5,6]
nums.reverse() #[6, 5, 4, 9, 3, 2, 1]
1.4 二维list类似可以使用以上的方法就不在重复讲了
2.旋转图像
给定 matrix =
[
[1,2,3],
[4,5,6],
[7,8,9]
],
原地旋转输入矩阵,使其变为:
[
[7,4,1],
[8,5,2],
[9,6,3]
]
解题思路:
先反转list, 然后交换对称
"""
/*
* clockwise rotate
* first reverse up to down, then swap the symmetry
* 1 2 3 7 8 9 7 4 1
* 4 5 6 => 4 5 6 => 8 5 2
* 7 8 9 1 2 3 9 6 3
*/
/*
* anticlockwise rotate
* first reverse left to right, then swap the symmetry
* 1 2 3 3 2 1 3 6 9
* 4 5 6 => 6 5 4 => 2 5 8
* 7 8 9 9 8 7 1 4 7
*/
"""
2.1 in-place的解法
class Solution:
def rotate(self, matrix: List[List[int]]) -> None:
matrix.reverse()
for i in range(len(matrix)):
for j in range(i+1, len(matrix[i])):
matrix[i][j], matrix[j][i] = matrix[j][i], matrix[i][j]
2.2 使用一行代码求解,但不是原位操作
original = [
[ 5, 1, 9,11],
[ 2, 4, 8,10],
[13, 3, 6, 7],
[15,14,12,16]
]
rotated = list(zip(*original[::-1])) #[(15, 13, 2, 5), (14, 3, 4, 1), (12, 6, 8, 9), (16, 7, 10, 11)]