【LeetCode刷题】移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums =[0,1,0,3,12]输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]输出:[0]
提示:
1 <= nums.length <= 104-231 <= nums[i] <= 231 - 1
方法思路
- 定义指针
k:用于记录非零元素应该放置的位置,初始为0。 - 遍历数组:将所有非零元素按原相对顺序移动到
k指向的位置,每放置一个非零元素,k自增1。 - 补零操作:遍历结束后,将
k到数组末尾的所有位置赋值为0,完成 “将 0 移到末尾” 的操作。
Python代码:
from typing import Listclass Solution:def moveZeroes(self, nums: List[int]) -> None:k = 0 # 记录非零元素的放置位置for i in range(len(nums)):if nums[i] != 0:nums[k] = nums[i]k += 1# 将剩余位置填充为0for i in range(k, len(nums)):nums[i] = 0# 主程序用于测试
if __name__ == "__main__":# 测试示例1nums1 = [0, 1, 0, 3, 12]solution = Solution()solution.moveZeroes(nums1)print("示例1结果:", nums1)# 测试示例2nums2 = [0]solution.moveZeroes(nums2)print("示例2结果:", nums2)
LeetCode提交代码:
class Solution:def moveZeroes(self, nums: List[int]) -> None:"""Do not return anything, modify nums in-place instead."""from typing import Listk = 0 # 记录非零元素的放置位置for i in range(len(nums)):if nums[i] != 0:nums[k] = nums[i]k += 1# 将剩余位置填充为0for i in range(k, len(nums)):nums[i] = 0
程序运行截图展示:

总结
本文介绍了一种原地移动数组中所有零元素到末尾的算法。通过使用双指针法,定义指针k记录非零元素位置,首先遍历数组将所有非零元素前移,保持原有顺序;然后在剩余位置补零。该算法时间复杂度为O(n),空间复杂度O(1),满足题目要求。Python实现代码展示了示例测试结果,验证了算法的正确性。该方法高效地解决了在不复制数组情况下移动零元素的问题,适用于LeetCode等相关编程题目。
