logo智能设计/合肥网络推广优化公司
题目:移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12],输出: [1,3,12,0,0]
说明:
1. 必须在原数组上操作,不能拷贝额外的数组。
2. 尽量减少操作次数。
-----------------------------------------------------------------------------
解法1:删除1个0,就在末尾添加0。该方法当 0有多个时效率底下。
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: void Do not return anything, modify nums in-place instead."""if len(nums) == 0 or len(nums) == 1:return numsfor num in nums:if num == 0:nums.remove(num)nums.append(0)print(nums)return nums
解法2:逆向循环,可以避免删除元素的下标混乱问题。
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: void Do not return anything, modify nums in-place instead."""if len(nums) == 0 or len(nums) == 1:return numsfor i in range(len(nums)-1, -1,-1):if nums[i] == 0:del nums[i]nums.append(0)return nums
解法3:移动非零元素。
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: void 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] = nums[i], nums[j]j += 1return nums
解法4#: 定义zeroP列表存放所有0元素的索引,访问数组时有规律的移动非零元素,并动态更新
表。
class Solution(object):def moveZeroes(self, nums):""":type nums: List[int]:rtype: void Do not return anything, modify nums in-place instead."""# 存放所有0元素的下标zeroPList = [] for i, num in enumerate(nums):if num == 0:zeroPList.append(i)elif len(zeroPList) != 0:index = zeroPList.pop(0) # 取出数组中最靠前的0元素下标nums[i], nums[index] = nums[index], nums[i] # 替换操作zeroPList.append(i) # 将更新后的0元素下标重新添加进数组中
参考:
https://blog.csdn.net/qiubingcsdn/article/details/82834214
https://blog.csdn.net/yuzhou_1shu/article/details/82779257