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

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

C++中,我们经常需要处理数组。有些情况下,我们需要将数组中的所有零移动到数组末尾。这个问题看起来简单,但实际上有很多方法可以解决它。在本文中,我们将介绍三种不同的解决方案。

方法一:暴力移动

最简单的方法是使用暴力解决方案,即遍历整个数组,将所有零移动到数组的末尾。以下是这个算法的C++代码实现:

void moveZeroes(vector<int>& nums) {
    int count = 0; // count表示所有已经遍历到的数字中0的个数
    for (int i = 0; i < nums.size(); i++) {
        if (nums[i] == 0) {
            count++;
        } else {
            nums[i - count] = nums[i];
        }
    }
    for (int i = nums.size() - count; i < nums.size(); i++) {
        nums[i] = 0;
    }
}

该函数接受一个整数向量nums作为参数,并通过引用修改它。我们在遍历整个数组时记录了所有遇到的零的数量。然后,我们将非零数字向前移动,并在数组末尾添加适当数量的零。

我们可以用以下代码测试它:

vector<int> nums{1, 0, 3, 0, 5, 0, 7, 0, 9};

moveZeroes(nums);

for (int num : nums) {
    cout << num << " ";
}

输出应该是:1 3 5 7 9 0 0 0 0

方法二:双指针

第二种解决方案是使用双指针。我们使用两个指针,一个指向最左侧的零元素,另一个指向当前元素。每当我们遇到一个非零元素时,我们将其复制到左指针位置,并将左指针向右移动。以下是该算法的C++代码实现:

void moveZeroes(vector<int>& nums) {
    int left = 0;
    for (int right = 0; right < nums.size(); right++) {
        if (nums[right] != 0) {
            nums[left++] = nums[right];
        }
    }
    for (int i = left; i < nums.size(); i++) {
        nums[i] = 0;
    }
}

这个函数的C++代码与前面的函数类似。只不过我们用两个指针循环遍历整个数组。右指针表示当前元素,而左指针表示最左侧的零元素。

以下是用C ++代码实现的测试代码:

vector<int> nums{1, 0, 3, 0, 5, 0, 7, 0, 9};

moveZeroes(nums);

for (int num : nums) {
    cout << num << " ";
}

输出应该是:1 3 5 7 9 0 0 0 0

方法三:快速排序

第三种解决方案是使用快速排序算法。在快速排序算法中,我们使用一个“支点”(pivot)元素将数组分为两个部分。在此特定情况下,我们将零视为支点元素。一旦支点确定,我们就可以在数组中找到第一个非零元素。然后,我们将非零元素交换到数组的左侧,并递归地重复此过程。以下是实现QuickSort的C++代码:

void quickSort(vector<int>& nums, int left, int right) {
    int i = left;
    int j = right;
    int pivot = 0;

    while (i <= j) {
        while (nums[i] == pivot) {
            i++;
        }

        while (nums[j] != pivot) {
            j--;
        }

        if (i <= j) {
            swap(nums[i], nums[j]);
            i++;
            j--;
        }
    }

    if (left < j) {
        quickSort(nums, left, j);
    }

    if (i < right) {
        quickSort(nums, i, right);
    }
}

void moveZeroes(vector<int>& nums) {
    quickSort(nums, 0, nums.size() - 1);
}

在这里,我们首先实现了QuickSort的标准分区函数,检查左指针和右指针当前指向的元素是否满足条件。如果不满足条件,我们就交换这两个元素。然后递归地分治左侧和右侧的子数组。

以上是快速排序算法的主要功能,用于在数组中找到并移动零元素。以下是用于测试的C++代码:

vector<int> nums{1, 0, 3, 0, 5, 0, 7, 0, 9};

moveZeroes(nums);

for (int num : nums) {
    cout << num << " ";
}

输出应该是:1 3 5 7 9 0 0 0 0

结论

在本文中,我们介绍了三种方法来将所有零移动到C++数组的末尾。第一种方法是最简单的,即暴力移动。第二种方法是使用双指针。最后,我们介绍了快速排序算法,也可以解决这个问题。尽管三种方法执行速度不同,根据你的使用情况,你可以选择更适合你的方法。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程

C++ 示例