如何实现无返回值的原地列表移零函数?现有代码待修正
原地移动列表中的零到末尾的实现问题分析
你的现有代码没有做到原地修改原列表,核心问题如下:
- 一开始
a = lst只是让变量a指向原列表的引用,但后面a = rest + zero直接让a指向了新拼接的列表,这时候a和原lst已经完全无关。 lst = a写在return a之后,这行代码根本不会执行——函数遇到return就会直接终止。- 你返回了新列表,但题目要求是原地修改原列表,不需要返回任何值。
提示1的作用(填充零法)
这个提示的思路是先整理非零元素,再补零:
- 先遍历列表,把所有非零元素依次放到列表的前半部分(用计数器记录当前要放置非零元素的位置)。
- 假设非零元素有
count个,那么从索引count开始到列表末尾的所有位置,统一赋值为0。
全程不需要创建新列表,直接在原列表上修改。
提示2的作用(双指针交换法)
这个提示是用双指针交换实现原地修改:
- 用
count作为慢指针,记录下一个非零元素应该放置的位置;i作为快指针,遍历整个列表。 - 当快指针
i遇到非零元素时,交换lst[i]和lst[count]的位置,然后count加1。 - 遍历结束后,所有非零元素会被移到列表前半部分,零自然聚集在末尾,全程操作原列表。
对应提示1的实现代码
def move_zero(lst): count = 0 # 将所有非零元素移到列表前半部分 for num in lst: if num != 0: lst[count] = num count += 1 # 从非零元素的末尾位置开始,填充零 for i in range(count, len(lst)): lst[i] = 0 # 测试 test_lst = [0,1,0,2,0,3,0,4] move_zero(test_lst) print(test_lst) # 输出: [1, 2, 3, 4, 0, 0, 0, 0]
对应提示2的实现代码
def move_zero(lst): count = 0 for i in range(len(lst)): if lst[i] != 0: # 交换当前非零元素与count位置的元素 lst[i], lst[count] = lst[count], lst[i] count += 1 # 测试 test_lst = [0,1,0,2,0,3,0,4] move_zero(test_lst) print(test_lst) # 输出: [1, 2, 3, 4, 0, 0, 0, 0]
内容的提问来源于stack exchange,提问作者Shannon Esteves
相关产品推荐
相关产品推荐

