问题:给定数组nums,写函数移动所有的0到数组末端,并且维持非零元素的顺序。
//不能开新的数组,必须in-place;最小化移动次数。
输入:nums
输出:移动0后的nums
思路:千万不能被题意的移动所干扰(即先别移动0,把非零元素放置好后,在其后补0)
class Solution {
public:
void moveZeroes(vector<int>& nums) {
int j=0;
int l=nums.size();
for(int i=0;i<l;i++)
{
if(nums[i]!=0)
{
nums[j]=nums[i];
j++;
}
}
for(int i=j;i<l;i++)
nums[i]=0;
}
};
solution[2]给了新的idea,分享一下。只考虑非零元素,将其与前面的0(因为是0就不交换,所以前面暂时为0)交换。这在非0元素较少的时候,操作次数优于我的算法。
void moveZeroes(vector<int>& nums) {
for (int lastNonZeroFoundAt = 0, cur = 0; cur < nums.size(); cur++) {
if (nums[cur] != 0) {
swap(nums[lastNonZeroFoundAt++], nums[cur]);
}
}
}