LeetCode移动零

LeetCode移动零

题目:将列表中的零移动到列表末尾
解法:4种
推荐:方法2,方法4
语言:python

题目介绍如下:
LeetCode移动零

题目通俗说明:

给定一个整数列表,将列表中所有的0元素重新排到列表末尾,要求其他元素顺序不变

解法如下:

# author:铁臂阿童木

# datetime:2022/1/30 8:22

# software: PyCharm


# 题目:将列表中的0移动到末尾,并且保证其他元素顺序不变,不能复制列表
# 解法:4种
# 推荐:方法2,方法4

# 先定义两个条件列表
nums1 = [0,1,0,3,12]
nums2 = [0]

# 序号:方法一
# 方法:循环判断删除补全法
# 思想:对列表进行循环,判断每个元素,如果为0就在列表末尾追加一个0,再将此位删除
# 优点:方法简单
# 缺点:耗时
def moveZeroes(nums):
    for num in nums:
        if num == 0:
            nums.append(0)
            nums.remove(num)    # 循环遇到一个0删除一个,末尾添加一个
        continue
    return nums

# print(moveZeroes(nums1))


# 序号:方法二
# 方法:双指针法
# 思想:利用双指针中的i指针找到0元素的位置,j指针找非0元素对两指针的元素进行置换,置换成功后都后移一位继续执行此操作
# 优点:省时
# 缺点:不容易理解
def moveZeroes2(nums):
    i = 0            # 找0的指针
    for j in range(len(nums)):
        if nums[j] != 0:     # j指针指向的值不等于0,就对两指针对应的值进行替换
            if i < j:        # 保证i指针与j指针没有同时指向一个元素
                nums[i] = nums[j]
                nums[j] = 0
            i += 1
    return nums

# print(moveZeroes2(nums3))


# 序号:方法三
# 方法:计数删除补全法
# 思想:对列表中0的个数进行计数,再利用循环将0都删除,最后在列表末尾追加0
# 优点:方法简单
# 缺点:耗时
def moveZeroes3(nums):
    count = nums.count(0)   # 计算出0的个数
    i = 0
    while i < count:
        nums.remove(0)      # 全部移除
        i += 1
    for j in range(count):
        nums.append(0)      # 末尾全部追加
    return nums

# print(moveZeroes3(nums1))


# 序号:方法四
# 方法:非0元素前置法+对0计数
# 思想:通过指针的位置-已循环列表0的个数对元素进行前置赋值,最后将0的个数赋值到列表最后
# 优点:省时
# 缺点:不容易理解
def moveZeroes4(nums):
    index = 0
    for i in range(len(nums)):
        if nums[i] == 0:      # 如果是0就将计数器+1
            index += 1
            continue
        nums[i-index] = nums[i]    # 否则就将非0元素前置
    """
    索引i-index解释:
    例:nums = [1,0,2]   count = 0
        第1次循环(nums[0]):i=0  取到1(非0)   ==》 直接将1赋值给nums[0-0](nums[i-index])
        第2次循环(nums[1]):i=1  取到0(==0)   ==》 计数器count + 1  ==》  现在count == 1     
        第3次循环(nums[2]):i=2  取到2(非0)   ==》 直接将2赋值给nums[2-1](nums[i-index])
        现在nums = [1,2,2]
        下面就按照计数器的个数对列表末尾的元素进行赋值0的操作        
    """
    for j in range(len(nums)-index,len(nums)):    # 从所有非0元素后开始,对计数好的0元素进行赋值
        nums[j] = 0
    return nums

print(moveZeroes4(nums1))


经验:

如果自己编写中出现错误,就针对简单示例数据进行测试,使用编译器的调试工具打断点测试!

个人心得

1.考虑条件判断中隐含的条件重复

感谢阅读!!!
有错误请您指出!!!
欢迎补充!!!

LeetCode移动零

上一篇:gc-标记整理算法的两种实现


下一篇:为什么0x00400000是可执行文件的默认基址?EXE base address start with 400000H