【Python】【LeetCode.283】移动零---谈谈for与while在可变数据类型中使用的差异

该博客讨论了如何在Python中将数组中的所有零移动到末尾,同时保持非零元素的相对顺序。通过两个不同的方法实现,一个是使用while循环,另一个是使用for循环。文中强调了在列表长度可能变化时,使用while循环的必要性,并指出在处理可变数据类型时需谨慎使用for循环,以避免`list index out of range`错误。此外,还总结了两者之间的区别和使用场景。
摘要由CSDN通过智能技术生成

给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。

#
# @lc app=leetcode.cn id=283 lang=python3
#
# [283] 移动零
#

# @lc code=start
class Solution:
    def moveZeroes(self, nums) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        cnt = 0
        i = 0
        while i < len(nums):
            if nums[i] == 0:
                del nums[i]
                cnt += 1  #第一次执行时i=0,由于第一个元素为0,下面的else未执行,所以当第二次执行时i依然为0
            else:
                i += 1
        nums.extend([0]*cnt)

if __name__ == "__main__":
    so = Solution()
    nums = [0,0,1]
    res = so.moveZeroes(nums)
    print(res)

# @lc code=end

如果使用的for循环:

#
# @lc app=leetcode.cn id=283 lang=python3
#
# [283] 移动零
#

# @lc code=start
class Solution:
    def moveZeroes(self, nums) -> None:
        """
        Do not return anything, modify nums in-place instead.
        """
        cnt = 0
        for i in range(len(nums)): #i每一次循环自动+1,当列表长度变短时,必然出现list index out of range
            if nums[i] == 0:
			#IndexError: list index out of range
                del nums[i]
                cnt += 1
        nums.extend([0]*cnt)

if __name__ == "__main__":
    so = Solution()
    nums = [0,0,1] #另外,第一个0被删除后,列表的第一个元素依然是0,如果使用for自增1的话,会遗漏掉部分元素的判断
    res = so.moveZeroes(nums)
    print(res)

# @lc code=end

总结:
1、无条件自增使用for,需要判断条件后再决定是否增加使用while
2、对可变数据类型的迭代对象,当迭代对象长度发生变化时,慎用for循环

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值