题目:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
实例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
分析:
使用双指针即可。
- 首先定义两个变量,一个存储遍历时的指针(用来寻找非0元素)暂且命名为“j”,另一个只存储0元素,暂且命名为“i”。
- 开始遍历整个数组,当j碰到非0数字时,开始交换这个非0数字和之前“i”指向的0
- 交换完毕后,i自增1,指向下一个0,然后j也自增1,找下一个非0数字。
因此每次交换,都是将左指针的零与右指针的非零数交换,且非零数的相对顺序并未改变。
代码:
Python
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
i = j = 0
while j<len(nums):
if nums[j] != 0:
temp = nums[j]
nums[j] = nums[i]
nums[i] = temp
i+=1
j+=1
Java
class Solution {
public void moveZeroes(int[] nums) {
int i = 0;
int j = 0;
while (j < nums.length){
if (nums[j] != 0) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
i++;
}
j++;
}
}
}
时间复杂度:O (n) n为序列长度
空间复杂度:O (1)