📌  相关文章
📜  C ++程序将所有零移动到数组末尾(1)

📅  最后修改于: 2023-12-03 14:59:37.338000             🧑  作者: Mango

C++程序将所有零移动到数组末尾

在数组操作中,“将所有零移动到数组末尾”是常见问题之一。在这个问题中,我们需要编写一个函数,该函数接受一个整数数组作为参数,并将其所有零元素移到数组的末尾,不改变其余元素的位置和顺序。

实现方案

下面介绍两种不同的实现方案。

方案一

该方案采用双指针技巧。双指针分别指向数组的首尾,当左指针指向一个零元素时,右指针继续向左移动,直到找到一个非零元素,然后将这个非零元素与左指针指向的零元素互换位置。这个过程一直进行到左指针和右指针相遇为止。

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)。

总结

无论使用哪种方案,都能够快速移动数组中的零元素到末尾,让程序在多次处理数组时都能够得到更好的性能。同时,这两种方案在数组长度和元素大小不同的情况下,都能够正常地工作。在实际开发中,应根据具体情况选择合适的方案。