我正在为了娱乐而解决CodeWars中的一个问题,但遇到了一些困难:
不理解在哪里需要修改代码,以便正确控制m和n的“转折点”,使其开始下降而不是上升。
适当地重构这个代码。
该算法的目的是像“蜗牛”一样遍历一个二维列表,例如:
[[1,2,3],
[4,5,6],
[7,8,9]]
应该返回
[1,2,3,6,9,8,7,4,5]
对于任何大小为n*n的列表
虽然我并不是数学或计算机科学背景很强的人,但我非常喜欢这两个领域,并尝试深入理解这些问题。
例如,如果n
表示2D列表的行,m
表示列,那么对于每个蜗牛的“电路”,我需要将最小的n
增加1,并为每个电路减少最大的m
,但我无法理解这一点需要发生在哪里。
我简要地看了一些递归解决方案,但在我开始深入研究之前,我希望有人可以看看这个问题,并帮助我理解我的思路完全错误的地方。
def snail(array):
new_snail = []
n,m = 0,0
j = 1
while j <= len(array):
print(n,m)
if n == 0 and m == 0:
while m < len(array)-j:
new_snail.append(array[n][m])
m += 1
while n < len(array)-j:
new_snail.append(array[n][m])
n += 1
else:
while m > 0:
new_snail.append(array[n][m])
m -= 1
while n > 0:
new_snail.append(array[n][m])
n -= 1
m += 1
n += 1
j+=1
return new_snail
这个算法在一个 3x3 的二维列表上的输出是
[1, 2, 3, 6, 9, 8, 7, 4, 5, 4]
,意味着我到达末尾后会向后移动。在一个更大的 4x4 二维列表中,
array = [[1,2,3,4],
[4,5,6,7],
[8,9,10,11],
[12,13,14,15]]
输出结果是
[1, 2, 3, 4, 7, 11, 15, 14, 13, 12, 8, 4, 5, 4, 5, 4]
,所以我在第一行来回移动。
谢谢您的关注,希望这符合SO问题的指导方针。 我更关心了解为什么我的代码有问题/不好的实践,而不是得到练习/正确的答案。更新
我认为我对问题有了更好的理解,并取得了一些进展,但仍然困扰我的是列表的范围。 我觉得我在一个方向上走得太远了,我的所有解决方案都很笨拙。
def snail(array):
new_snail = []
visited = "*"
i,j = 0,0
current_dir = "right"
def change_dir(direction):
if direction == "right":
return "down"
elif direction == "down":
return "left"
elif direction == "left":
return "up"
elif direction == "up":
return "right"
def move(ipos,jpos,direction):
i,j = ipos,jpos
if i == -1:
i += 1
elif i == len(array):
i -= 1
elif j == -1:
j +=1
elif j == len(array):
j -= 1
if direction == "right":
return i, j+1
elif direction == "down":
return i+1, j
elif direction == "left":
return i, j-1
elif direction == "up":
return i-1, j
new_snail.append(array[0][0])
array[0][0] = "*"
while len(new_snail) < len(array)**2:
i,j = move(i,j,current_dir)
if 0 <= i <= len(array)-1 and 0 <= j <= len(array)-1:
if array[i][j] != visited:
new_snail.append(array[i][j])
array[i][j] = "*"
else:
current_dir = change_dir(current_dir)
else:
current_dir = change_dir(current_dir)
return new_snail