刚开始没把这题当个事,随便写了,说是timeout,却没给测试用例,以为真有什么玄机呢,看了下网上别人的答案也都差不多,改了改原来的,这次过了。新版本确实能简单点,不用标志,不用continue,但复杂度应该是一样的。新版本如下:
int removeDuplicates(int *A, int n) {
if(n==0||n==1)
return n;
int i=0,j=0;
while(j<n)
{
A[i] = A[j];
if(j+1<n&&A[j+1]==A[j])
{
A[i+1] = A[j+1];
i+=2;
j+=2;
}
else
{
++i;
++j;
}
while(A[j]==A[j-1])
++j;
}
return i;
}
老版本如下:没通过
int removeDuplicates(int A[], int n) {
int i=0,j=0;
bool flag = false;
while(j<n)
{
if (!flag)
{
A[i] = A[j];
if(A[j+1]==A[j])
{
A[i+1] = A[j+1];
i+=2;
j+=2;
}
else
{
++i;
++j;
}
flag = true;
continue;
}
if(A[j]!=A[j-1])
{
flag = false;
continue;
}
++j;
}
return i;
}
恩,编程确实应该越简单越好,高手和差手的差别就是高手把复杂的变简单,差手把简单的变复杂。