283. 移动零
Easy
题目描述:
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
示例 1:
输入: nums = [0,1,0,3,12]
输出: [1,3,12,0,0]
示例 2:
输入: nums = [0]
输出: [0]
解题思路:
- 首先获取了向量的长度,并判断了向量是否为空或长度为零,如果是,则直接返回,不做任何操作。
- 然后,定义了一个变量j,用于记录非零元素的位置,并初始化为零。
- 接下来,使用一个for循环,从头到尾遍历向量中的每个元素,用变量i表示当前元素的索引。
- 在循环体中,判断当前元素是否不等于零,如果是,则执行以下操作:
- 如果当前元素的索引大于j,说明之前有零元素存在,则将当前元素赋值给向量中j位置的元素,并将向量中i位置的元素置为零。这样就实现了非零元素的前移和零元素的后移。
- 然后,将j加一,指向下一个非零元素的位置。
- 如果当前元素等于零,则不做任何操作,继续遍历下一个元素。
- 循环结束后,函数也结束,此时向量中的所有零元素都被移动到了末尾。
代码实现:
#include<iostream>
#include<vector>
using namespace std;
class Solution
{
public:
void moveZeroes(vector<int>& nums) {
//定义一个函数,参数是一个整数向量的引用
int length = nums.size();//获取向量的长度
if (nums.empty()||length==0)//如果向量为空或长度为0,直接返回
{
return;
}
int j = 0;//定义一个变量j,用来记录非零元素的位置
for (int i = 0; i < length; i++)//遍历向量中的每个元素,用变量i表示当前位置
{
if (nums[i]!=0)//如果当前元素不为零
{
if (i > j) {//如果当前位置大于j,说明有零元素在前面,需要交换
nums[j] = nums[i]; //将当前元素放到j位置
nums[i] = 0; //将当前位置置为零
}
j++; //更新j的值,指向下一个非零元素的位置
}
}
}
};
int main() {
Solution sol;
cout << "请输入数组的大小";
int n;
cin >> n;
vector<int> nums;
cout << "请输入数组";
for (int i = 0; i < n; i++)
{
int x; // 用来存储每个元素
cin >> x; // 输入每个元素
nums.push_back(x); // 把元素放入数组中
}
sol.moveZeroes(nums);
for (int i = 0; i <nums.size(); i++)
{
cout << nums[i]<<" ";
}
return 0;
}