1.暴力解法
由于队列有先进先出的特性,则先使用队列将数组中非0的原粗存入队列中,再定义一个count变量用来记录数组中0的个数,第一次遍历完数组后,将队列中的元素从数组0下标开始依次放入数组中,再在末尾添加count个0,代码如下:
public void moveZeroes(int[] nums) {
Queue<Integer> queue = new LinkedList<>();
int count = 0;//记录0的个数
for (int i = 0; i < nums.length; i++) {
if (nums[i] != 0) {
queue.offer(nums[i]);
} else {
count++;
}
}
int j = 0;
for (int i : queue) {
nums[j++] = i;
}
while (count > 0) {
nums[j++] = 0;
count--;
}
}
2.双指针算法
定义两个指针,left和right,初始状态下lift指向-1位置,right指向0位置,当right下标的值为0,则right向后移动一位,当right下标的值不为0,则left向后移动一位,同时交换lift下标和right下标的值,随着移动发现,left和right将整个数组分为三个部分,left左边为处理过的非零数据,left到right为处理过的零数据,right右边则为待处理的数据,流程图如下:
代码如下:
public void moveZeroes(int[] nums) {
int left = -1;
int right = 0;
while (right < nums.length) {
if (nums[right] == 0) {
right++;
} else {
left++;
swap(nums, left, right);
right++;
}
}
}
public void swap(int[] nums, int i, int j) {
int temp = nums[i];
nums[i] = nums[j];
nums[j] = temp;
}