Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array A = [1,1,1,2,2,3]
,
Your function should return length = 5
,
and A is now [1,1,2,2,3]
.
思路:需要一个标志位记录当前这个数出现的次数,如果和前面的不相等,肯定得覆盖,并且记录出现了两次,如果和前面相等,那么出现次数多一次,如果出现的次数已经为两次,那么也允许覆盖。
#include <iostream>
#include <vector>
using namespace std;
/*
Follow up for "Remove Duplicates":
What if duplicates are allowed at most twice?
For example,
Given sorted array A = [1,1,1,2,2,3],
Your function should return length = 5, and A is now [1,1,2,2,3].
*/
int RemoveDuplicate(vector<int>& vec)
{
if(vec.size()<=2)
return vec.size();
int i,flag=1,j;
i =0;
for(j=1;j<vec.size();j++)
{
if(vec[j] != vec[j-1])
{
i++;
vec[i] = vec[j];
flag =1;
}
else
{
flag++;
if(flag==2)
{
i++;
vec[i] = vec[j];
}
}
}
return i+1;
}
int main()
{
int array[]={1,1,2,2,3,4,4,5,6,7};
vector<int> vec(array,array+sizeof(array)/sizeof(int));
cout<<RemoveDuplicate(vec);
return 0;
}
同样使用一个标志位来表示
int removeDuplicates(vector<int>& vec)
{
int i=0,j=1,flag=0;
for(j=1;j<vec.size();j++)
{
if(vec[j] == vec[i] && !flag)
{
i++;
vec[i] = vec[j];
flag =1;
}
if(vec[j]!=vec[i])
{
i++;
vec[i] = vec[j];
flag =0;
}
}
return i+1;
}