classSolution: defmoveZeroes(self, nums: List[int]) -> None: """ Do not return anything, modify nums in-place instead. """ ifnot nums: return # 这种方法创建了新数组,不符合原地操作的要求 res = [] for i in nums: if i != 0: res.append(i) for i inrange(len(nums) - len(res)): res.append(0) # 注意:需要切片赋值 nums[:] = res # 直接 nums = res 只会改变局部引用,不会影响原始内存地址 nums[:] = res
原地解
方法一:两轮遍历
思路:使用两个指针。第一个指针用于记录当前已填充非零元素的位置,第二个指针负责遍历数组。
第一轮遍历:将所有非零元素按顺序移动到数组前端。
第二轮遍历:将剩余位置全部补零。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
classSolution: defmoveZeroes(self, nums: List[int]) -> None: ifnot nums: return # 慢指针 j 记录下一个非零元素应该存放的位置 j = 0 for i inrange(len(nums)): if nums[i] != 0: nums[j] = nums[i] j += 1 # 将剩余位置补零 for i inrange(j, len(nums)): nums[i] = 0