如何计算列表中整数到最近0的距离?解决索引越界问题
解决列表元素到最近0的距离问题,同时避免索引越界
你遇到的索引越界问题根源很明确:用while list[index] != 0循环找0时,没给index加边界限制——比如当你从某个位置往左/右找0,但方向上根本没有0时,index会一直往超出列表范围的方向跑(比如变成-1或者大于列表长度的数),自然就触发索引越界了。
给你一个简单可靠的方案,用两次遍历就能搞定,完全不会有越界问题:
思路
- 左→右遍历:记录每个位置到左边最近0的距离
- 右→左遍历:记录每个位置到右边最近0的距离,然后和左→右得到的距离取最小值,就是该位置到最近0的距离
代码示例(Python)
def nearest_zero_distance(nums): n = len(nums) result = [float('inf')] * n # 左→右遍历,找左边最近的0 last_zero = -float('inf') for i in range(n): if nums[i] == 0: last_zero = i result[i] = 0 else: result[i] = i - last_zero # 右→左遍历,找右边最近的0,取最小值 next_zero = float('inf') for i in range(n-1, -1, -1): if nums[i] == 0: next_zero = i result[i] = 0 else: result[i] = min(result[i], next_zero - i) return result # 测试示例 input_list = [5, 0, 8, 87, 96, 0, 54] print(nearest_zero_distance(input_list)) # 输出 [1, 0, 1, 2, 1, 0, 1]
代码解释
- 第一次遍历:从左往右走,遇到0就更新
last_zero的位置,非0元素的距离就是当前索引减last_zero(因为左边最近的0就在last_zero位置) - 第二次遍历:从右往左走,遇到0就更新
next_zero的位置,非0元素的距离取当前值(左边的距离)和next_zero - 当前索引(右边的距离)里更小的那个 - 用
float('inf')初始化结果列表,是为了保证第一次遍历时,左边没有0的元素(比如列表开头的元素)会被赋予一个很大的初始值,第二次遍历时会被右边的距离覆盖
这样既解决了你的需求,又完全不会出现索引越界的问题。
内容的提问来源于stack exchange,提问作者mattriz212
相关产品推荐
相关产品推荐

