Python全排列程序异常求助:[1,2,3]排列返回值与初始列表一致
问题排查与修复
核心问题1:列表引用导致输出全部一致
你的代码中ans.append(nums)直接将列表nums的引用添加到结果列表中,而非当前状态的副本。因为列表是可变对象,后续对nums的修改会同步影响ans中所有已添加的元素。当最后一轮get_per将数组重新排序为[1,2,3]时,ans里的所有元素都会变成这个初始值。
修复方法:每次添加时传入列表的副本,替换为:
ans.append(nums.copy()) # 或 ans.append(list(nums))
核心问题2:get_per函数返回值错误
当处理到最后一个排列(如[3,2,1])时,rindex=-1,此时你执行return arr.sort()。但sort()是原地排序方法,返回值为None,这会导致nums被赋值为None,后续逻辑虽因k减到0停止,但属于明显逻辑错误。
修复方法:先执行原地排序,再返回数组:
if rindex == -1: arr.sort() return arr
可选优化:下一个排列的索引查找逻辑
当前get_per中寻找rindex的逻辑是从左往右遍历,记录最后一个arr[i] > arr[i-1]的位置,这在短数组中能运行,但不符合标准下一个排列算法的规范(标准算法是从右往左找第一个arr[i] < arr[i+1]的位置)。若要适配更长数组,建议修改为:
# 替换原rindex查找代码 for i in range(n-2, -1, -1): if arr[i] < arr[i+1]: rindex = i break else: rindex = -1
修正后的完整代码
from typing import List def permute(nums: List[int]) -> List[List[int]]: def fact(n): pr = 1 for i in range(1,n+1): pr = pr*i return pr def get_per(arr): rindex = -1 n = len(arr) # 优化后的rindex查找逻辑 for i in range(n-2, -1, -1): if arr[i] < arr[i+1]: rindex = i break if rindex == -1: arr.sort() return arr pindex = rindex + 1 # 寻找比arr[rindex]大的最小元素 for i in range(rindex+1, n): if arr[i] > arr[rindex] and arr[i] < arr[pindex]: pindex = i arr[rindex], arr[pindex] = arr[pindex], arr[rindex] arr[rindex+1:] = sorted(arr[rindex+1:]) return arr ans = [] k = fact(len(nums)) while k != 0: ans.append(nums.copy()) print(ans) nums = get_per(nums) k -= 1 print('-----') print(ans) print('-----') return ans print(permute([1,2,3]))
运行修正后的代码,会得到正确的全排列输出:
[[1, 2, 3]] [[1, 2, 3], [1, 3, 2]] [[1, 2, 3], [1, 3, 2], [2, 1, 3]] [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]] [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2]] [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] ----- [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]] ----- [[1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1], [3, 1, 2], [3, 2, 1]]
内容的提问来源于stack exchange,提问作者vijayrealdeal
相关产品推荐
相关产品推荐

