题目描述
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
必须在不复制数组的情况下原地对数组进行操作。
方法思路
这里使用了两种方式解题:
- 先收集非0元素,将非0元素重新排序后剩余元素都为0再往后顺延排序
- 遍历所有元素,如果当前元素不为零,就把这个元素移动到numbers处,并给原来位置上元素赋值为0,每次移动后numbers自增,直到完成遍历后,所有非0元素都被移动到数组前端
方法一
public void MoveZeroes(int[] nums)
{
int numbers=0;
if (nums.Contains(0))
{
//整理非0元素
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] != 0)
{
nums[numbers++] = nums[i];
}
}
//剩余元素都为0
for (int i = numbers; i < nums.Length; i++)
{
nums[i] = 0;
}
}
}
方法二
public void MoveZeroes2(int[] nums)
{
int numbers = 0;
if (nums.Contains(0))
{
for (int i = 0; i < nums.Length; i++)
{
if (nums[i] != 0)//判断是否非零元素
{
if (i!=numbers)
{
nums[numbers] = nums[i];//将num[i]移动到数组前端
nums[i] = 0;//这里将重复的num[i]赋值为0
}
numbers++;
}
}
}
}