题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
题目分析
方法一:非零数字提前
这道题目直接思路便是将零删除然后将非零数字提前,所以解决方案一便是遍历数组找出非零数字并将他们提到数组最前端,剩下的全部填零。
方法二:快慢指针
还有一个思路是采用两个指针,一个指向零一个指向非零,然后交换两个数字的位置,交换之后指针向后继续推进,知道全部遍历完。
其中,快指针一直向下遍历,慢指针则是永远停在零的位置。
class Solution{
public void moveZeroes(int[] nums) {
int i =0;//慢指针指向第一个
//快指针随着遍历一直向前
for(int j =0;j<nums.length;j++){
if(nums[j]!=0){
int temp = nums[i];
nums[i]=nums[j];
nums[j]=temp;
i++;
}
}
}
}