📅  最后修改于: 2023-12-03 14:53:51.030000             🧑  作者: Mango
在处理一个包含数字的数组时,我们有时需要将所有的零移动到数组的末尾。这可以通过多种方法来实现,本文将介绍一种基于单次遍历的方法。
我们定义两个指针i和j,将i指向第一个元素,将j指向最后一个元素。然后,我们开始遍历数组,当遇到非零元素时,将它交换到i所指向的位置,然后将i向后移动一位。当遇到零元素时,将j向前移动一位,直到它指向第一个非零元素的位置,然后将它交换到i所指向的位置,再将i向后移动一位。
通过这种方法,我们最终可以将所有的零元素都移动到数组的末尾,并保持其它元素的相对顺序。
下面是使用C++语言实现该算法的代码片段:
void moveZeroes(vector<int>& nums) {
int n = nums.size();
int i = 0, j = n-1;
while(i <= j) {
if(nums[i] == 0) {
swap(nums[i], nums[j]);
j--;
}
else {
i++;
}
}
}
该程序使用了C++ STL库中的vector容器来存储数组。函数moveZeroes的参数num是一个指向vector
在循环的每个迭代中,我们首先检查nums[i]是否等于0。如果是,我们就交换nums[i]和nums[j]的值,并将j向前移动一位。如果不是,我们就将i向后移动一位。当循环结束时,所有的零元素都被移动到了数组的末尾。
通过使用单次遍历,我们可以将数组中的所有零元素移动到末尾,从而在保持其它元素的相对顺序的同时,将数组变成一个更加规整和易于处理的形式。这种方法的时间复杂度为O(n),空间复杂度为O(1),效率很高。