给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
示例 1:
输入: nums =[0,1,0,3,12]
输出:[1,3,12,0,0]
示例 2:
输入: nums =[0]
输出:[0]
解法一,消除法
一个比较讨巧的方法,直接消除数组中所有的零,然后在后面加上对应个数的零。
public void moveZeroes(int[] nums) {
int j=0;
for(int i=0;i<nums.length;i++)
{
if(nums[i]!=0)
{
nums[j]=nums[i];
j++;
}
}
for(int i=j;i<nums.length;i++)
{
nums[i]=0;
}
}
解法二,双指针
left指针用于划分边界,总是指向第一个0;right指针用于遍历数,如果找到不等0的,就将left和right的数交换。结果使left指针的右边全是0。
public void moveZeroes(int[] nums) {
int n=nums.length,left=0,right=0,t;
while(n>0)
{
if(nums[right]!=0)
{
t=nums[left];
nums[left]=nums[right];
nums[right]=t;
left++;//交换之后让left继续指向第一个0.
}
right++;
n--;
}
}