给定一个 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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)