1.移动零
题目链接:. - 力扣(LeetCode)
代码:
class Solution {
public:
void moveZeroes(vector<int>& nums) {
for(int cur=0, dest = 0; cur<nums.size(); cur++)
{
cout<<"int"<<endl;
if(nums[cur])
swap(nums[dest++], nums[cur]);
}
}
};
保证left指向第一个零, right指向left后的第一个非零。此时交换nums[left], nums[right]可以保证顺序不变且零元素都在后面
2.复写零
题目链接:. - 力扣(LeetCode)
代码:
class Solution {
public:
void duplicateZeros(vector<int>& arr) {
//正向复写会导致复写速度快于读取速度, 采取反向便利
int n = arr.size();
int left = 0, right = -1;
//求出最后边界字母
while(right<n-1)
{// 维持:当到下标为left时, 对应复写后下标为right
if(arr[left] == 0) right+=2;
else right++;
cout<<"left:"<<left<<"right:"<<right<<endl;
left++;
}
left--;//抵消最后一次left++
int border = left;
cout<<left<<" "<<right<<endl;
if(right == n)// 溢出
{//arr[border]为0 造成溢出
cout<<"溢出"<<left<<" "<<right<<endl;
arr[n-1] = 0;
right-=2;
left--;
}
while(left>=0)
{
cout<<left<<" "<<right<<endl;
if(arr[left] == 0)
{
arr[right--] =0;
arr[right--] =0;
}
else
{
arr[right--] = arr[left];
}
left--;
}
}
};
找到合适border:明确left, right意义即可
解决溢出问题:见代码
注意事项&代码解析见上注释