LeetCode移动零
题目:将列表中的零移动到列表末尾
解法:4种
推荐:方法2,方法4
语言:python
题目介绍如下:
题目通俗说明:
给定一个整数列表,将列表中所有的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.考虑条件判断中隐含的条件重复
感谢阅读!!!
有错误请您指出!!!
欢迎补充!!!