题目:
给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
具体步骤为:
1. 定义一个右指针 right,初始化指向 0;
2. 从左到右遍历数组 nums;
3. 如果当前元素 nums[i] 为 0,将 right 移动至第一个非 0 元素的位置;
4. 如果 right 遍历至数组末尾,说明数组仅含 0 元素,直接返回;
5. 否则,交换 nums[i] 和 nums[right] 处的元素,将第一个非 0 元素移至 nums[i] 位置;
6. 重复步骤 3~5,直至 right 遍历至数组末尾;
7. 遍历完成,返回。
class Solution {
public:
void moveZeroes(vector<int>& nums) {
// 定义右指针right,用于查找第一个非零元素的位置
int right;
// 从左到右遍历数组nums
for(int i=0;i<nums.size();i++){
// 如果当前元素为0
if(nums[i]==0){
// 将right移动到第一个非零元素的位置
right=i;
while(right<nums.size()&&nums[right]==0){
right++;
}
// 如果 right 遍历至数组末尾,说明没有非零元素,直接返回
if(right==nums.size())
return;
// 否则,交换i和right处的元素,将非零元素移动到左边
swap(nums[i],nums[right]);
}
}
// 遍历完成,返回
return;
}
};