给定一个数组 nums, 编写一个函数将所有 0 移动到数组的末尾, 同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/move-zeroes/ 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
#基本思路: 新建一个索引指针j,原索引指针i上的值不等于0时,把值放到j索引位置上
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
j=0
for i in range(len(nums)):
if nums[i]!=0:
nums[j]=nums[i]
if i !=j:
nums[i]=0
j+=1
①Python List count() 方法 用于统计某个元素在列表中出现的次数。 语法:list.count(obj) 参数:obj – 列表中统计的对象。 返回值:返回元素在列表中出现的次数。
②Python List remove()方法
remove() 函数用于移除列表中某个值的第一个匹配项
。
语法:list.remove(obj)
参数:obj – 列表中要移除的对象。
返回值:该方法没有返回值但是会移除列表中的某个值的第一个匹配项
。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in range(nums.count(0)):
nums.remove(0)
nums.append(0)
key的值指定bool, 就只对0和非零排序, 非0中的1,3,4或者1,4,3不排序; 用lambda x:x!=0也一样,(运行速度要快)
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
nums.sort(key=bool, reverse=True) #运行时间48 ms 内存消耗 14.4 MB
#nums.sort(key=lambda x:x!=0,reverse=True) 运行时间 28 ms 内存消耗 14.4 MB
LeetCode提交显示错误,解法灵感来源:约瑟夫环问题
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
for i in nums:
if i == 0:
nums=nums[:nums.index(i)] + nums[nums.index(i)+1:]
nums.append(i)
return nums
但是在自己IDE里测试时候是可以正确输出的
nums=[0,1,0,3,12]
for i in nums:
if i == 0:
nums=nums[:nums.index(i)] + nums[nums.index(i)+1:]
print(nums)
nums.append(i)
print(nums)
print(nums)
#函数封装
def moveZeroes(nums):
"""
Do not return anything, modify nums in-place instead.
"""
for i in nums:
if i == 0:
nums=nums[:nums.index(i)] + nums[nums.index(i)+1:]
nums.append(i)
return nums
moveZeroes(nums)
最后,换了一个东西测试了下, 可能的原因是 for 遍历的时候nums的内存指向没变