📅  最后修改于: 2023-12-03 14:59:37.338000             🧑  作者: Mango
在数组操作中,“将所有零移动到数组末尾”是常见问题之一。在这个问题中,我们需要编写一个函数,该函数接受一个整数数组作为参数,并将其所有零元素移到数组的末尾,不改变其余元素的位置和顺序。
下面介绍两种不同的实现方案。
该方案采用双指针技巧。双指针分别指向数组的首尾,当左指针指向一个零元素时,右指针继续向左移动,直到找到一个非零元素,然后将这个非零元素与左指针指向的零元素互换位置。这个过程一直进行到左指针和右指针相遇为止。
void moveZeroes(vector<int>& nums) {
int left = 0, right = nums.size() - 1;
while (left < right) {
if (nums[left] != 0) {
left++;
continue;
}
if (nums[right] == 0) {
right--;
continue;
}
swap(nums[left], nums[right]);
left++;
right--;
}
}
该方案的时间复杂度为O(n),空间复杂度为O(1)。
该方案采用一次遍历的策略,将所有非零元素按它们原来的顺序尽可能地移到数组前面,其余位置上的元素全部置零。
void moveZeroes(vector<int>& nums) {
int i = 0;
for (int j = 0; j < nums.size(); j++) {
if (nums[j] != 0) {
nums[i++] = nums[j];
}
}
while (i < nums.size()) {
nums[i++] = 0;
}
}
该方案的时间复杂度为O(n),空间复杂度为O(1)。
无论使用哪种方案,都能够快速移动数组中的零元素到末尾,让程序在多次处理数组时都能够得到更好的性能。同时,这两种方案在数组长度和元素大小不同的情况下,都能够正常地工作。在实际开发中,应根据具体情况选择合适的方案。