给定一个 n
x n
数组,返回从最外面的元素到中间的元素排列的数组元素,顺时针方向移动。
例如:
array = [[1,2,3],
[4,5,6],
[7,8,9]]
snail(array) #=> [1,2,3,6,9,8,7,4,5]
复制代码
array = [[1,2,3],
[8,9,4],
[7,6,5]]
snail(array) #=> [1,2,3,4,5,6,7,8,9]
复制代码
具体排序如图:
Python 代码实现
如果各位大神有更好的步骤,欢迎指出呀!
简单的循环解法
第一种:
# 蜗牛排序
array = [
[1, 2, 3],
[4, 5, 6],
[4, 5, 6]
]
def snail(arrays):
arr_list = cycle(arrays)
arr = arr_list[1]
lists = arr_list[0]
while len(arr) != 0:
# 执行蜗牛排序
arr_list = cycle(arrays)
arr = arr_list[1]
lists += arr_list[0]
# print(lists)
return lists
def cycle(arrays):
arr_list = arrays
# 获取列表长度
length = len(arr_list)
lists = []
popList = []
for i in range(length):
# 第一个列表正常排序
if i == 0:
[lists.append(i) for i in arr_list[i]]
# 获取除第一个列表外的其他列表的最后一位数
elif i < length:
lists.append(arr_list[i][length - 1])
arr_list[i].pop(length - 1)
# 移除已排序的数字
popList.append(arr_list[i].pop(0))
# 反转最后一个列表
if i == length - 1:
arr_list[i].reverse()
[lists.append(i) for i in arr_list[i]]
# 反转抛出列表并填充进入排序
popList.reverse()
for i in popList:
lists.append(i)
# 使函数跳出循环
arr_list.pop(0)
length = len(arr_list)
if length == 0:
pass
else:
arr_list.pop(length - 1)
return lists, arr_list
print(snail(array))
复制代码
第二种
def snail(array):
ret = []
if array and array[0]:
size = len(array)
for n in range((size + 1) // 2):
for x in range(n, size - n):
ret.append(array[n][x])
for y in range(1 + n, size - n):
ret.append(array[y][-1 - n])
for x in range(2 + n, size - n + 1):
ret.append(array[-1 - n][-x])
for y in range(2 + n, size - n):
ret.append(array[-y][n])
return ret
复制代码
第三种
def snail(array):
next_dir = {"right": "down", "down":"left", "left":"up", "up":"right"}
dir = "right"
snail = []
while array:
if dir == "right":
snail.extend(array.pop(0))
elif dir == "down":
snail.extend([x.pop(-1) for x in array])
elif dir == "left":
snail.extend(list(reversed(array.pop(-1))))
elif dir == "up":
snail.extend([x.pop(0) for x in reversed(array)])
dir = next_dir[dir]
return snail
复制代码
使用第三方库
import numpy as np
def snail(array):
m = []
array = np.array(array)
while len(array) > 0:
m += array[0].tolist()
array = np.rot90(array[1:])
return m
复制代码
其他解法
def snail(array):
out = []
while len(array):
out += array.pop(0)
array = list(zip(*array))[::-1] # Rotate
return out
复制代码
近期评论