给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
示例:
输入: [0,1,0,3,12]
输出: [1,3,12,0,0]
说明:
必须在原数组上操作,不能拷贝额外的数组。
尽量减少操作次数。
这道题的解法,我最先想到的就是暴力法,就是将所以nums中非0的地址放在一个vector中,然后再对nums重新赋值,最后将0放在后面。
解法一,暴力解:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int len = nums.size();
vector<int>temp;
int len2=0;
for(int i=0;i<len;i++){
if(nums[i]!=0){
temp.push_back(i);
len2++;
}
}
// int len2 = temp.size();
for(int j=0;j<len2;j++){
nums[j]=nums[temp[j]];
}
for(int k=len2;k<len;k++){
nums[k]=0;
}
}
};
当然这道题是有最优解法的,下面展示我看到最简单的解法:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int i=0,j=0;j<nums.size();j++){
if(nums[j]!=0){
swap(nums[i++],nums[j]);
}
}
}
};
这个我想,你一看就懂吧