283.Move Zeroes
Given an array nums, write a function to move all 0’s to the end of it while maintaining the relative order of the non-zero elements.
For example, given nums = [0, 1, 0, 3, 12], after calling your function, nums should be [1, 3, 12, 0, 0].
Note: You must do this in-place without making a copy of the array. Minimize the total number of operations. 要求将数组中的0放在数组末尾,并且其余元素不能改变相对顺序,不能用额外空间,尽可能减少操作。介绍两种解法: 1.遍历数组,将数组中所有非0值通过赋值放到前面来,并且记录0的个数,然后在最后把0补进去。见代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j = 0;
// move all the nonzero elements advance
for (int i = 0; i < nums.size(); i++) {
if (nums[i] != 0) {
nums[j++] = nums[i];
}
}
for (;j < nums.size(); j++) {
nums[j] = 0;
}
}
};
2.利用vector内置函数 这是一个十分惊艳的解法,是我在讨论区看到的,只用了一行代码就解决了问题,使用了remove和fill函数。算法是遍历整个vector,发现等于c的元素就用后一个元素值来替代当前元素值。vector整体的size()不变。(比如对1234这个序列remove 2,返回的序列是 1344(3被复制到2的位置,4被复制到3的位置))。然后返回一个迭代器(第一个是c的位置的迭代器)。看代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
fill(remove(nums.begin(),nums.end(),0),nums.end(),0);
}
};