求助:求解整数数组的出口方向判断算法难题
解决数组移动退出/循环问题的正确思路
这个问题的核心其实是跟踪已访问的索引——死循环的本质就是重复踏入同一个索引,而退出的判断则是看移动后的索引是否超出数组边界。你之前的“全正数”思路确实太局限了,咱们来一步步拆解正确的解法:
核心逻辑梳理
先明确三种结果的判定条件:
- 右侧退出:移动后的索引 ≥ 数组长度
- 左侧退出:移动后的索引 < 0
- 死循环:回到了已经访问过的索引(意味着会无限重复当前路径)
具体算法步骤
- 用一个集合(或者标记数组)记录已经走过的索引,避免重复判断
- 从索引0开始,循环执行以下操作:
- 如果当前索引已经在访问集合里,直接判定为死循环
- 将当前索引加入访问集合
- 计算下一个索引:
当前索引 + 当前索引对应的数组值 - 检查下一个索引的状态:
- 若小于0 → 返回左侧退出
- 若大于等于数组长度 → 返回右侧退出
- 否则,将当前索引更新为下一个索引,继续循环
结合示例验证
拿你给出的例子走一遍流程,更直观:
- 示例[2,0,-1]:
- 初始索引0 → 加入集合,计算0+2=2
- 索引2 → 加入集合,计算2+(-1)=1
- 索引1 → 加入集合,计算1+0=1 → 1已经在集合里,判定死循环
- 示例[1,-2]:
- 索引0 → 加入集合,计算0+1=1
- 索引1 → 加入集合,计算1+(-2)=-1 <0 → 判定左侧退出
代码实现(Python)
def judge_move_result(nums): visited = set() current_idx = 0 arr_length = len(nums) while current_idx not in visited: # 标记当前索引已访问 visited.add(current_idx) # 计算下一个位置 next_idx = current_idx + nums[current_idx] # 检查是否触发退出条件 if next_idx < 0: return "从左侧退出" if next_idx >= arr_length: return "从右侧退出" # 更新当前索引,继续循环 current_idx = next_idx # 走到这里说明回到了已访问的索引,陷入死循环 return "陷入死循环"
测试你的所有示例:
print(judge_move_result([1,1,1])) # 输出:从右侧退出 print(judge_move_result([1,-2])) # 输出:从左侧退出 print(judge_move_result([2,0,-1])) # 输出:陷入死循环 print(judge_move_result([2,5,1,-2,0])) # 输出:从右侧退出
这个解法能覆盖所有场景,不管数组里是正、负还是0,都能准确判断结果~
内容的提问来源于stack exchange,提问作者Paritosh M
相关产品推荐
相关产品推荐

