Python实现:检测符合特定遍历规则的完美列表
Python实现:检测符合特定遍历规则的完美列表
我理解你现在的困扰——原来的for循环是按列表原顺序迭代的,完全不符合题目要求的跳转遍历逻辑,这确实很容易踩坑。咱们先把问题拆解清楚,再一步步实现正确的逻辑。
首先明确完美列表的两个核心判定标准:
- 从索引0开始跳转遍历,最终必须停在值为0的单元格(不能中途卡住、越界,也不能无限循环)
- 遍历过程中必须恰好访问过列表中的每一个元素一次(没有重复访问,也没有遗漏任何元素)
你之前代码的核心问题
- 用
for val in lst循环是按列表原始顺序走的,和题目要求的“按当前单元格值跳转”的遍历逻辑完全不匹配 - 你用
lst_idx存储的是元素值而非访问过的索引,根本没法判断是否覆盖了所有位置,也无法检测循环 - 终止条件的判断逻辑不完整,既没检查是否最终停在0,也没验证是否遍历了所有元素
正确的实现思路
- 用一个集合记录已经访问过的索引:既能快速判断是否出现循环(重复访问同一索引),也能最后验证是否覆盖了所有元素
- 用
while循环模拟跳转遍历:从索引0开始,每次根据当前索引对应的值跳转到下一个索引 - 每一步的关键检查:
- 如果跳转的索引越界,直接抛出
IndexError(和你之前的逻辑一致) - 如果遇到值为0的单元格,先把该索引加入已访问集合,再检查集合长度是否等于列表长度(即所有元素都被访问过)
- 如果遇到重复访问的索引,说明出现循环,无法遍历全列表,直接返回
False
- 如果跳转的索引越界,直接抛出
最终实现代码
def is_perfect(lst): """ 判断给定列表是否为"完美列表": 从索引0开始按规则跳转遍历,最终停在值为0的单元格,且遍历过所有元素 :param lst: 待判断的非负整数列表 :return: 如果是完美列表返回True,否则返回False;若跳转索引越界则抛出IndexError """ visited = set() current_idx = 0 list_length = len(lst) while True: # 检查当前索引是否超出列表范围 if current_idx >= list_length: raise IndexError("跳转索引超出列表有效范围") # 遇到值为0的单元格时,检查是否遍历完所有元素 if lst[current_idx] == 0: visited.add(current_idx) # 只有当所有元素都被访问过,才是完美列表 return len(visited) == list_length # 如果当前索引已被访问过,说明出现循环,无法遍历全列表 if current_idx in visited: return False # 标记当前索引为已访问 visited.add(current_idx) # 跳转到下一个索引(当前单元格的值就是下一个索引) current_idx = lst[current_idx]
测试验证
咱们用题目里的例子测试:
- 第二个例子
[3,0,1,4,2]:
遍历路径是0→3→4→2→1→0,访问过的索引是{0,3,4,2,1},最后加入0的索引后集合长度等于列表长度5,返回True - 第一个例子
[2,2,3,2,0]:
遍历路径是0→2→3→2,此时2已经在已访问集合中,直接返回False - 测试不完美的列表
[1,0,2]:
遍历路径是0→1(遇到0),已访问集合是{0,1},长度2≠3,返回False
这个逻辑完全贴合题目要求,也解决了你之前循环顺序不对的问题。
备注:内容来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

