给定一个数组 nums
,编写一个函数将所有 0
移动到数组的末尾,同时保持非零元素的相对顺序。
请注意 ,必须在不复制数组的情况下原地对数组进行操作。
思路:遍历数组元素,判定为0,则采用erase从数组删除,然后push_back在结尾补回来,也可以counter计数有多少0,最后统一处理;
!!!切记,判定为0后i--,边界也要减减,不然会死循环
#include <iostream>
#include <vector>using namespace std;class Solution {
public:void moveZeroes(vector<int>& nums) {int noneZeroCount = nums.size();for (int i = 0; i < noneZeroCount; i++) {if (nums[i] == 0) {nums.erase(nums.begin() + i);nums.push_back(0);i--; // 处理可能删除元素导致的索引变化noneZeroCount--; // 处理可能插入新元素导致的索引变化}}}
};int main() {Solution s;vector<int> nums = {0, 0, 1};s.moveZeroes(nums);for (auto i : nums)cout << i << " ";cout << endl;return 0;
}
思路: 也可以采用冒泡排序的方法,遇到0就与后一个元素进行交换,直至循环结束。可以设置交换的sign,默认置为false,如果存在交换则true,一次遍历后如果依然是false则表示遍历的子数组中不含0元素,都在末尾了。
#include <iostream>
#include <vector>using namespace std;// class Solution {
// public:
// void moveZeroes(vector<int>& nums) {
// int noneZeroCount = nums.size();
// for (int i = 0; i < noneZeroCount; i++) {
// if (nums[i] == 0) {
// nums.erase(nums.begin() + i);
// nums.push_back(0);
// i--; // 处理可能删除元素导致的索引变化
// noneZeroCount--; // 处理可能插入新元素导致的索引变化
// }
// }
// }
// };// 冒泡排序class Solution {public:void moveZeroes(vector<int>& nums) {for (int i = 0; i < nums.size(); i++) {bool reverse = false;for (int j = 0; j < nums.size() - i - 1; j++){if (nums[j] == 0) {swap(nums[j], nums[j + 1]);reverse = true;}}if (!reverse) break; // 最后一次交换后,数组已经有序,提前退出}}
};int main() {Solution s;vector<int> nums = {0, 0, 1};s.moveZeroes(nums);for (auto i : nums)cout << i << " ";cout << endl;return 0;
}